【问题标题】:Regex - pattern capture everything except for pattern [.net]正则表达式 - 模式捕获除模式 [.net] 之外的所有内容
【发布时间】:2011-07-03 00:50:48
【问题描述】:

我想捕捉任何东西,但不包括特定的模式。我的实际问题与从 html 中解析信息有关,但我将问题提炼为一个示例,希望能澄清我的问题。

来源

xaxbxcabcabc

所需匹配

xaxbxc

如果我使用前瞻,表达式将捕获第一次出现

.*(?=abc) => xaxbxcabc

我想要一些类似于否定字符类的东西,只是为了一个否定模式。

.*[^abc] //where abc as a pattern instead of a list giving anything but a, b or c

我正在使用http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx 进行测试

【问题讨论】:

  • 您可能会发现regexhero.net/tester 也是一名优秀的测试人员。
  • @Mormegil 使用*? 的答案是您想要的答案。仅供参考,可能会有负面的前瞻,因此您的最后一个代码块将变为.*(?!abc)。但是,这似乎与您的情况无关,也不是消极的向后看。 .*(?!abc) 将从您的样本中捕获 xaxbxcabcabc.*(?<!abc) 将捕获 xaxbxcabcab
  • @Matti - 我理解反对使用正则表达式解析 html。我的情况可能(或者我很容易出错)有点不同。在这种情况下,我试图从特定页面中提取特定信息,该页面的 html 格式不正确并且不包含内容含义的语义信号。我正在使用正则表达式来查找内容含义的上下文指示。结果将是一个脆弱的数据捕获功能,我知道只要网站所有者更改标记,我就必须对其进行编辑。在理想情况下,他们会提供一个 api,或者至少生成更好的 html。
  • @driis - 感谢您的建议,我会检查那个测试器。

标签: .net regex


【解决方案1】:

为什么不使用replace

string result = new Regex("abc.*$").Replace ( input, "" );

这将删除从第一个匹配短语开始的所有内容,让您保留直到该点为止的所有内容。

【讨论】:

  • 感谢您的回答。对于我使用的示例,这不仅可行,而且可能是最干净的解决方案。但是,在我正在处理的情况下,它会增加一个步骤。我正在使用lookbehind来启动模式。因此,我必须在后视之后匹配所有内容,然后对该匹配进行替换。
【解决方案2】:

非贪婪(惰性)量词 *? 在这里可能很有用,例如

^(?<captured>.*?)abc.*$

编辑:为了清楚起见,(当然)不需要显式捕获,真正重要的部分只是

(.*?)abc

【讨论】:

  • 感谢您的回复。我希望我可以选择多个接受的答案。
【解决方案3】:

如果您锚定正则表达式,您将解决问题(+ 使用惰性量词):

"^.*?(?=abc)"

【讨论】:

  • 感谢您的回复。这是我决定采用的解决方案。
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2016-12-20
  • 2015-06-22
  • 2010-12-13
相关资源
最近更新 更多