我正在使用RegexBuddy,但无论如何我都遇到了麻烦:\
我正在逐行处理一个文件。我建立了一个“线模型”来匹配我想要的东西。
现在我想做一个反向匹配......即我想匹配有6个字母的字符串的行,但前提是这六个字母不 Andrea ,我该怎么做?
编辑:我会编写使用这个正则表达式的程序,我还不知道如果在python或php中,我首先要做的就是学习一些正则表达式:)有不同的类型的行,我想用正则表达式来选择我感兴趣的类型。一旦我得到这些行,我就应用其他过滤器只是为了不匹配已知值,我需要所有其他人,而不是那个。 (?!not-wanted)工作得很好,谢谢。 : - )
我希望这澄清了这个问题:)
答案 0 :(得分:57)
(?!Andrea).{6}
假设你的正则表达式引擎支持负向前瞻......
编辑:..或者您可能更愿意使用[A-Za-z]{6}
代替.{6}
编辑(再次):请注意,前瞻和后瞻通常不是“反转”正则表达式匹配的正确方法。 Regexs并没有真正设置为进行负匹配,而是将它留给你使用它们的任何语言。
答案 1 :(得分:44)
对于Python / Java,
^(.(?!(some text)))*$
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
答案 2 :(得分:15)
更新了Alan Moore
的反馈意见在PCRE和类似的变体中,您实际上可以创建一个匹配任何不包含值的行的正则表达式:
^(?:(?!Andrea).)*$
这称为tempered greedy token。缺点是它表现不佳。
答案 3 :(得分:10)
您使用的是哪种语言?正则表达式实现的功能和语法对此很重要。
你可以使用预测。以python为例
import re
not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)
要打破这一点:
(?!Andrea)表示'匹配,如果接下来的6个字符不是“Andrea”';如果是那么
\ w 表示“单词字符” - 字母数字字符。这等同于[a-zA-Z0-9 _]
类\ w {6} 表示正好6个字符。
re.IGNORECASE 表示您将排除“Andrea”,“andrea”,“ANDREA”......
另一种方法是使用你的程序逻辑 - 使用不匹配Andrea的所有行,并通过第二个正则表达式来检查6个字符。或者首先检查至少6个单词字符,然后检查它是否与Andrea不匹配。
答案 4 :(得分:5)
答案 5 :(得分:4)
如果你想在RegexBuddy中执行此操作,有两种方法可以获得与正则表达式不匹配的所有行的列表。
在“测试”面板的工具栏上,将测试范围设置为“逐行”。执行此操作时,同一工具栏上的“全部列出”按钮下将显示“无匹配列出所有行”项。 (如果未看到“全部列出”按钮,请单击主工具栏中的“匹配”按钮。)
在GREP面板上,您可以打开“基于行”和“反转结果”复选框,以获取您要翻阅的文件中不匹配行的列表。
答案 6 :(得分:3)
(?!
在实践中很有用。
虽然严格来说,展望未来不是数学定义的正则表达式。
您可以手动编写反转正则表达式。
这是a program自动计算结果。 它的结果是机器生成的,通常比手写一个复杂得多。 但结果有效。
答案 7 :(得分:0)
我刚刚想出了这种可能是硬件密集型的方法,但它正在运行:
您可以用空字符串替换与正则表达式匹配的所有字符。
这是一个oneliner:
@Effect()
searchMoreForQuery$ = this.actions$
.ofType(PlayerSearchActions.SEARCH_MORE_FOR_QUERY)
.map(toPayload)
.withLatestFrom(this.store)
.map((latest: any[]) => latest[1])
.filter((store: EchoesState) => !store.search.isSearching)
.mergeMap((store: EchoesState) =>
this.youtubeSearch.searchMore(store.search.pageToken.next)
.search(store.search.query, store.search.queryParams)
.map(youtubeResponse => this.playerSearchActions.searchResultsReturned(youtubeResponse)));
我用过这个是因为我被迫使用一个非常复杂的正则表达式而无法弄清楚如何反转它的每个部分。
这只会返回字符串结果,而不是任何匹配对象!
答案 8 :(得分:-3)
在Perl中你可以做到
进程($ line)if($ line =〜!/ Andrea /);