2013-03-04 36 views
9

我試圖快速找到包含一個術語但缺少另一個術語的所有.java文件。我正在使用MyEclipse 10.7及其「搜索|」文件搜索「功能,該功能支持正則表達式。正則表達式來查找包含一個單詞但不是另一個的文件

在這種情況下,正則表達式會工作嗎?正確的正則表達式會是什麼?

TIA, 史蒂夫

回答

12

我能找到工作的唯一解決方案是以下正則表達式:

^(?!.[\s\S]*MISSING_TERM).[\s\S]*INCLUDED_TERM.*$ 

它發現每一個文件,其中包括INCLUDED_TERM,但缺乏MISSING_TERM,無論行。

關鍵是\s\S,它確保搜索整個文件,而不是每一行。

+0

就像一個魅力。 – 2014-09-03 07:09:45

0

(?m)\A(?=.*REGEX_TO_FIND)(?!.*MISSING_REGEX.*).*\z

正則表達式可以得到有點棘手,但它分解成兩個部分。

  1. 找到相符的術語/短語/單詞。這部分不是太棘手,因爲這是正則表達式通常會尋找的東西。
  2. 找到不存在的術語。這是棘手的部分,但它是可能的。

我有這表明你要如何找到在文本字connectReadOnly,並無法找到disconnect一個例子HERE。由於該文本包含connectReadOnly,因此它開始尋找下一個作品,未找到disconnect。由於disconnect在文本中,它在整個字符串上失敗(您需要爲整個文件匹配)。如果你玩第二塊,否定部分(?!.*disconnect.*),你可以將它設置爲你需要的任何正則表達式。在我的示例中,我不想在我的代碼中的任何位置找到disconnect :)您可以輕鬆地用您的單詞替換該單詞以進行搜索,甚至可以使用更復雜的正則表達式來「找不到」。

關鍵是使用多行模式,該模式使用開頭(?m)設置,然後使用字符串字符的開始/結束。使用^$開始/結束一行,其中\A\z開始和結束一個字符串,從而擴展整個文件的匹配。

編輯:對於connectReadOnlydisconnect問題用途:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z。更新的例子可以找到here

+0

這似乎很接近,但仍然返回一些誤報(例如包含這兩個詞的文件)。這是我嘗試的表達式,但返回包含這兩個詞的文件: (?m)^(?=。* connectReadOnly)((?! disconnect)。)* $ 我的目標是找到具有' connectReadOnly'在任何行上,但缺少術語'斷開連接'。 – Fred 2013-03-05 02:37:31

+0

@SAL已對此答案進行了更改,請嘗試一下......現在應該可以使用:) – Walls 2013-03-05 19:59:57

+0

這也不起作用。我想知道是否Eclipse中的正則表達式解析器與你正在使用的不同? 我在找到各種來源提示後找到的作品是:^(?!。[\ s \ S] * disconnect)。[\ s \ S] * connect。* $ – Fred 2013-03-06 01:07:51

0

您可以使用類似:

(?<!.*bar)foo(?!.*bar) 

如果「foo」被發現,但將匹配「酒吧」不是。

注意:您必須配置使用正則表達式多搜索引擎(EX:記事本+ +有一個叫做一個選項「相匹配換行。」),因爲通常的點代表任意字符除了換行符。

1

如果你想找到它的單行線,像這樣使用:

^(?!.*MISSING_TERM).*INCLUDED_TERM.*$ 

您還可以使用\作爲轉義字符,因爲你可能需要像class\.variable

+0

實際上,我在另外一個問題上提出了這個問題,但是我被低估爲雷電。這就是爲什麼我回答你的問題。我相信這個信息應該堅持在計算器上。除此之外,我非常傷心。 – leventunver 2017-04-20 10:37:32

+1

非常好的答案(y)。 Viva住broda。 – 2017-05-17 20:48:15

相關問題