匹配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可以包含特殊字符
提前感谢。
我相信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/