繁体   English   中英

如何忽略C#中的正则表达式匹配?

[英]How to ignore regex matches in C#?

输入字符串:

string datar = "aag, afg, agg, arg";

我正在尝试获取匹配项:“ aag”和“ arg”,但以下操作无效:

string regr = "a[a-z&&[^fg]]g";
string regr = "a[a-z[^fg]]g";

在C#中忽略正则表达式匹配的正确方法是什么?

显而易见的方法是使用a[a-eh-z]g ,但是您也可以尝试使用负向后视,例如:

string regr = "a[a-z](?<!f|g)g"

说明:

  • a匹配字符“a”
  • [az]匹配“ a”和“ z”之间的单个字符
  • (?<!XXX)断言不可能将下面的正则表达式与在此位置结束的匹配相匹配(负向后看)
    • f|g匹配字符“ f”或匹配字符“ g”
  • g匹配字符“ g”

角色类并不是那么花哨。 简单的解决方案是:

a[a-eh-z]g

如果您确实想明确列出不属于您的字母,则可以尝试以下方法:

a[^\W\d_A-Zfg]g

该字符类匹配所有内容,除了:

  1. \\W排除非单词字符,即标点符号,空格和其他特殊字符。 剩下的是字母,数字和下划线_
  2. \\d删除数字,所以现在我们有了字母和下划线_
  3. _删除下划线,因此现在我们仅匹配字母。
  4. AZ删除了大写字母,所以现在我们只匹配小写字母。
  5. 最后,在这一点上,我们可以列出不想匹配的单个小写字母。

总而言之,这比我们可能想要的要复杂得多。 这是您的正则表达式!

您使用的是Java的集合交集语法:

a[a-z&&[^fg]]g

表示两个集合('a' THROUGH 'z')(ANYTHING EXCEPT 'f' OR 'g') ('a' THROUGH 'z')的交集。 我所知道的其他正则表达式都没有使用该符号。 .NET风格使用更简单的集合减法语法:

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#演示:

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

如果要匹配argaag请尝试以下aag

a[ar]g

如果要匹配afgagg以外的所有内容,则需要此正则表达式:

a[^fg]g

似乎您要匹配任意三个字母字符,但条件是第二个字符不能为fg 如果是这种情况,为什么不使用以下正则表达式:

string regr = "a[a-eh-z]g";

正则表达式: a[a-eh-z]g 然后使用Regex.Matches获取匹配的子字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM