2013-03-20 74 views
0

有兩個字符串作爲參數(s1, s2)我應該能夠設置一個new Regex(my_regular_expression(s1, s2))。例如S1 = 「ABCD」,S2 = 「XYZ」 我想匹配字符串:用C#中的任意字符分隔的兩個單詞匹配的串聯子串(任何順序)

regex.IsMatched(X)== TRUE,其中x是下列之一:

abcd.xyz 
abcd-xyz 
xyzabcd 
dxy 
yzab 
z a 
dx 
cd 
but not limited to 

regex.IsMatched(y)==false,其中y是下列之一:

aabcd.xyzv 
abd.xyz 
xycd 
but not limited to 

之間S1和S2可以有任何或任何字符。 s1的任何右邊子字符串(請參閱函數string.right(string str,int length))與s2的左側子字符串(請參閱函數string.left(string str,int length))或與s1的左側子字符串連接的任何右側子字符串s2連接。

請在正則表達式中使用s1和s2而不是abcd,xyz。 s1/s2可以包含特殊字符。

預先感謝您。

+0

爲什麼會'dxy'比賽,但不是'aabcd.xyzv'? 'xycd'呢?你能否用更完整的正則表達式應該匹配的定義來更新問題? – 2013-03-20 14:17:48

回答

1

我相信Combined會給你你想要的表情。它有以下限制。

  • 目前,它允許任何字符的兩半(​​在你的例子.-)相結合,即使它是一個字母。
  • SuffixPart不支持不符合單個UTF-16編碼點的Unicode字符。如果您需要處理這個邊緣案例,請致電here is a related question that talks about Java code
  • 就此而言,PrefixPart也不支持不是單個UTF-16編碼點的Unicode字符,但該方法沒有被「破壞」。

下面是代碼:

public static string PrefixPart(string str) 
{ 
    return 
     string.Join("(?:", str.Select(i => Regex.Escape(i.ToString()))) 
     + string.Join(")?", Enumerable.Repeat(string.Empty, str.Length)); 
} 

public static string SuffixPart(string str) 
{ 
    return PrefixPart(new string(str.Reverse().ToArray())); 
} 

public static string Combined(string str1, string str2) 
{ 
    string left = SuffixPart(str1) + ".?" + PrefixPart(str2); 
    string right = SuffixPart(str2) + ".?" + PrefixPart(str1); 
    return string.Format("^{0}|{1}$", left, right); 
} 
0

我只想做

"/" + s1 + ".?" + s2 + "|" + s2 + ".?" + s1 + "/" 

這將評估爲(在你的例子):

/abcd.?xyz|xyz.?abcd/ 

即以任何順序的零個或一個任意字符隔開雙方需要的模式。

+0

這不適用於我的例子:檢查http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx – algorytmus 2013-03-20 14:01:34

+0

@algorytmus我能夠得到它的工作很好,但該網站沒有永久鏈接。這裏:http://rubular.com/r/qFX5Ib4Kog – 2013-03-20 14:15:31

+0

擺脫兩端的''/「'。 C#/ .NET並不要求你像其他一些風格一樣將分隔符包含在分隔符中。 – 2013-03-20 16:37:31

相關問題