【问题标题】:Regex quotes and not a specific word before quotes正则表达式引号而不是引号前的特定单词
【发布时间】:2019-03-26 22:26:16
【问题描述】:

我想做的就是这么简单,但同时又不是。

我在 C# 中有一个 RegEx 的功能来查找引号内的所有单词, 但如果引号前存在特定单词,则忽略整个单词并继续下一行。 同时仍在引号内寻找特定类型的符号并忽略。

例子-

My RegEx = @"(?<!Foo\()\""[^{}\r\n]*\""";

Text -
dontfindme1 = "Hello{}"
dontfindme2 = Foo("ABC")
findme1 = "Just a simple text to find"
findme2 = SuperFoo("WORKS")

输出示例 -

"ABC"
"Just a simple text to find"
"WORKS"

现在我的问题是我不想在引号之前找到名称“Foo(” 而且我不想找到“{”或“}”或“(”或“)”或新行 我只需要找不到“ABC”并跳到下一行。

【问题讨论】:

  • 机会.(。现在点匹配任何字符。试试(?&lt;!Foo\()\"[^{}\r\n]*\"
  • 感谢您的回答,我确实尝试过这个,VS2017 告诉我我有一个“无法识别的转义序列”...
  • 尝试在 @ 前面加上 string pattern = @"(?&lt;!Foo\()\""[^{}\r\n]*\""";
  • 现在它可以正常工作,但仍然可以找到前面有 'Foo(' 的引号。
  • 你能举个例子吗?是所有单词都在自己的行上还是有多个单词?

标签: c# regex quotes


【解决方案1】:

您可以使用否定的lookahead (?! 来检查字符串是否与双引号之间的{}Foo( 不匹配

^(?!.*\bFoo\()(?!.*"[^"\r\n]*[{}][^"\r\n]*").*$

在 C# 中string pattern = @"^(?!.*\bFoo\()(?!.*""[^""\r\n]*[{}][^""\r\n]*"").*$";

Regex demo

说明

  • ^断言字符串的开始
  • (?! 负前瞻,断言后面的内容没有
    • .*\bFoo\( 匹配任意字符 0+ 次,后跟单词边界和 Foo(
  • ) 关闭负前瞻
  • (?! 负前瞻,断言后面的内容没有
    • .* 匹配任意字符0+次
    • "[^"\r\n]* 匹配双引号,匹配 0+ 次而不是 ", \r, \n
    • [{}] 匹配 {}
    • [^"\r\n]*" 匹配 0+ 次而不是 "\r\n 后跟匹配双引号
  • ) 关闭负前瞻
  • .* 匹配任意字符 0+ 次
  • $断言字符串结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多