匹配由C#正则表达式中的任何字符分隔的两个单词的连接子串(以任何顺序)

时间:2013-03-20 13:49:50

标签: c# regex

将两个字符串作为参数(s1, s2)我应该能够设置new Regex(my_regular_expression(s1, s2))。例如s1 =“abcd”,s2 =“xyz”我想匹配字符串:

  

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))连接,或者s2的任何右子串与s1的左子串连接。

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

提前谢谢。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我会做的

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

这将评估为(在您的示例中):

/abcd.?xyz|xyz.?abcd/

这两种模式都是以零或任何一个字符分隔的任何顺序。