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

本文关键字:任意 连接 单词 两个 字符串 顺序 字符 分隔 正则表达式 匹配 | 更新日期: 2023-09-27 18:04:47

有两个字符串作为参数(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

but 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可以包含特殊字符

提前感谢。

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

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

  • 它目前允许任何字符组合两半(.-在你的例子),即使它是一个字母。
  • SuffixPart不支持不适合单个UTF-16码位的Unicode字符。如果你需要处理这种极端情况,这里有一个关于Java代码的相关问题。
  • 对于这件事,PrefixPart也不支持Unicode字符,这不是一个单一的UTF-16码点,但该方法并没有"严重"破坏。

代码如下:

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);
}

我就写

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

这将计算为(在您的示例中):

/abcd.?xyz|xyz.?abcd/