【问题标题】:Regex to match single words/character sets that aren't in quotes正则表达式匹配不在引号中的单个单词/字符集
【发布时间】:2015-04-13 16:19:36
【问题描述】:

我正在寻找一个正则表达式 (C#) 来匹配没有被引号包围的单词。一个示例输入字符串是:

dbo.test line_length "引用的词" 未引用

这需要匹配

dbo.test

线长

未引用

所以 3 个单独的匹配项和“引用的单词”不匹配。引用的短语可以是输入中的任何位置...开始、中间、结束等。

我无法想出一个正则表达式来匹配不在引号中的单词,而引号中可能有空格...我已经能够匹配如下内容:你好“世界”并且只得到你好。

有没有办法编写我正在尝试的正则表达式?

【问题讨论】:

  • 您没有指定您使用的是哪个regex。有些,如 Javascript,不支持环视。其他的,比如 PCRE 或 Python,可以。这是使用哪种正则表达式语言?
  • 这是用 C# 编写的
  • 你为什么不发布你拥有的正则表达式?
  • 您希望如何定义“单词”?除引号之外的任何非空白字符,例如ain'tfoo-bar.baz_spam@example.com 等?你还关心单引号还是双引号?

标签: c# regex


【解决方案1】:

有两种方法可以解决此问题,具体取决于您要对输出执行的操作。

首先,匹配(但不捕获)引号内的任何文本。 (这是专门匹配你不想要的东西。) 使用| 管道,使用捕获组来选择您想要保留的所有内容。

例子:

".*?"|(\b\S+\b)

您可以查看here 的示例。

另一个选项,使用环视,是专门从单词的开头向后看,以确保" 不会出现在那里:

(?<!")(\b\S+\b)(?!")

你可以看到here

当您开始使用多个单词时,这可能会出现问题,但这应该会让您走上正轨,并且您可以指出其中一种方法是否比另一种更适合您。

【讨论】:

  • 第一个似乎正在工作。如果引号中的单词超过 2 个,则第二个不会。
  • 您可以进一步扩展第一个引号以包含转义引号:regex101.com/r/lH7uN6/4,它使用否定的后视来确保您不匹配 \"。 (可选)如果您想允许使用 '.'要跨越多行,请添加 s 标志(在 gm 标志旁边)。您可以在该 regex101 页面上看到它的实际效果。
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 2012-09-26
  • 2022-01-07
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多