2011-02-23 45 views
2

我想捕捉任何内容,但不包括特定的模式。我的实际问题与解析HTML中的信息有关,但我将这个问题归结为一个例子,希望能够澄清我的问题。正则表达式 - 模式捕捉除了模式[.net]以外的所有内容

来源

xaxbxcabcabc 

所需的匹配

xaxbxc 

如果我使用一个超前的表达将捕获第一次出现

.*(?=abc) => xaxbxcabc 

我想SOMET沿着一个否定的角色类别的行,只是为了一种否定的模式。

.*[^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测试

+2

[正则表达式是不解析HTML(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contained标签/ 17324 54#1732454) – 2011-02-23 19:35:58

+1

你可能会发现http://regexhero.net/tester/也是一个很好的测试者。 – driis 2011-02-23 19:37:09

+0

@ Mormegil使用'*?'的答案就是你想要的。只是供参考,它可能有一个负面的前瞻,所以你最后的代码块将变成'。*(?!abc)'。然而,这与你的情况似乎并不相关,也不是负面的后顾之忧。 '。*(?!abc)'会从您的示例中捕获'xaxbxcabcabc','。*(?<!abc)'会捕获'xaxbxcabcab'。 – 2011-02-23 20:10:24

回答

3

如果锚定的正则表达式,你会解决问题(+使用懒惰量词的):

"^.*?(?=abc)" 
+0

感谢您的回复。这是我决定采取的解决方案。 – Hypnovirus 2011-02-23 21:02:52

2

为什么不使用replace

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

这将开始删除一切从第一个匹配的短语,让你所有的内容,直到那一点。

+0

感谢您的回答。对于我使用的例子,这不仅可以工作,而且可能是最干净的解决方案。但是,在我正在处理的情况下,它会添加一个步骤。我正在使用lookbehind来启动模式。所以,我必须在看起来后面匹配所有内容,然后在该匹配上进行替换。 – Hypnovirus 2011-02-23 20:36:07

4

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

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

编辑:只要是明确的,明确的捕捉是没有必要的(当然),真正重要的部分只是

(.*?)abc 
+0

感谢您的回复。我希望我可以选择多个接受的答案。 – Hypnovirus 2011-02-23 21:03:46