0

有两个字符串作为参数(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的任何右子字符串(参见函数)与 s2string.right(string str,int length)的左子字符串(参见函数string.left(string str,int length))或 s2 的任何右子字符串与 s1 的左子字符串连接。

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

先感谢您。

4

2 回答 2

1

我相信Combined会给你你想要的表达。它有以下限制。

  • 它目前允许任何字符组合两半(示例中的.or -),即使它是一个字母。
  • SuffixPart不支持不适合单个 UTF-16 代码点的 Unicode 字符。如果您需要处理这种极端情况,这里有一个有关 Java 代码的相关问题
  • 就此而言,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);
}
于 2013-03-21T20:21:08.450 回答
0

我会做

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

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

/abcd.?xyz|xyz.?abcd/

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

于 2013-03-20T13:53:46.787 回答