2013-03-20 76 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

相关问题