输入字符串:
string datar = "aag, afg, agg, arg";
我正在尝试获得匹配:“aag”和“arg”,但是以下内容不起作用:
string regr = "a[a-z&&[^fg]]g";
string regr = "a[a-z[^fg]]g";
在C#中忽略正则表达式匹配的正确方法是什么?
答案 0 :(得分:3)
显而易见的方法是使用a[a-eh-z]g
,但您也可以尝试negative lookbehind这样:
string regr = "a[a-z](?<!f|g)g"
说明:
a
匹配字符“a”[a-z]
匹配“a”和“z”(?<!XXX)
断言不可能将下面的正则表达式与在此位置结束的匹配相匹配(负后看)
f|g
匹配字符“f”或匹配字符“g”g
匹配字符“g”答案 1 :(得分:3)
角色类并不那么花哨。简单的解决方案是:
a[a-eh-z]g
如果你真的想明确列出不属于的字母,你可以试试:
a[^\W\d_A-Zfg]g
此字符类匹配除以下内容之外的所有内容:
\W
排除非单词字符,即标点符号,空格和其他特殊字符。剩下的是字母,数字和下划线_
。\d
删除了数字,所以现在我们有字母和下划线_
。_
删除了下划线,所以现在我们只匹配字母。A-Z
删除大写字母,所以现在我们只匹配小写字母。一切都比我们想要的更复杂。这是你的正则表达式!
答案 2 :(得分:3)
您使用的是Java的 set intersection 语法:
a[a-z&&[^fg]]g
..表示两组('a' THROUGH 'z')
和(ANYTHING EXCEPT 'f' OR 'g')
的交集。我所知道的其他正则表达式没有使用这种符号。 .NET flavor使用更简单的 set subtraction 语法:
a[a-z-[fg]]g
...就是设置('a' THROUGH 'z')
减去集合('f', 'g')
。
Java演示:
String s = "aag, afg, agg, arg, a%g";
Matcher m = Pattern.compile("a[a-z&&[^fg]]g").matcher(s);
while (m.find())
{
System.out.println(m.group());
}
C#demo:
string s = @"aag, afg, agg, arg, a%g";
foreach (Match m in Regex.Matches(s, @"a[a-z-[fg]]g"))
{
Console.WriteLine(m.Value);
}
两者的输出是
aag
arg
答案 3 :(得分:2)
如果您想要匹配arg
和aag
:
a[ar]g
如果您想匹配除afg
和agg
之外的所有内容,则需要此正则表达式:
a[^fg]g
答案 4 :(得分:0)
您似乎正在尝试匹配任意三个字母字符,条件是第二个字符不能是f
或g
。如果是这种情况,为什么不使用以下正则表达式:
string regr = "a[a-eh-z]g";
答案 5 :(得分:0)
正则表达式:a[a-eh-z]g
。
然后使用Regex.Matches获取匹配的子字符串。