2013-08-04 63 views
3

我試圖找到單詞「我」和「不同意」(不區分大小寫)之間的最短字符序列。我已經閱讀了所有關於SO的類似問題,但沒有一個解決方案似乎適用於我。下面是一個例子句子引起我的悲傷:如何提取兩個單詞之間的最少字符?

As an American, I must disagree with you.

這裏是我最好的猜測,一個正則表達式模式:

I(.*?)disagree

我想捕捉只是「必須」,但相反,我捕獲的字符串較長,「可以,我必須」。我希望不必指定「我」必須跟隨其他東西,如空間。因爲,那麼我不會在句子中捕獲任何東西,例如,「我不同意這一點。」我也不想堅持「我」被大寫。基本上,我只想要儘可能少貪心的比賽。這個網站是我使用驗證解決方案的地方之一:

http://regexpal.com/?flags=gi &正則表達式= I%* 28%3F%29%20disagree &輸入=作爲%20AN%20American%2C%20I%20must%20disagree%20with%20you。

+0

使用'\ B',要求各地捕獲的部分*字邊界*。然後收集所有比賽並選擇最短的? – DCoder

+0

這是一個實際的用例嗎? – Gumbo

+1

如果輸入是「我有點不同意」,你想要「」還是「」nda「'? – user2357112

回答

1

的一般方法是使用negative lookahead

(I)(((?!\1).)*?) disagree 

demo這裏。

注意中間的單詞現在是$2。如果你不希望出現這種情況,你可以重複第1個字:

I((?:(?!I).)*?) disagree 

但我要說的第一個版本是更易於維護,特別是如果這個詞是bigger

+0

所有這些答案都非常有幫助。然而,這種負面預測方法更正是我試圖用我的正則表達式模式完成的。 – user2649854

1

使用單詞邊界(\b):

/\bi(.*?)\bdisagree/i 
  • 不區分大小寫
  • 比賽I,但不I'll(該'll將所拍攝的部分)
+0

在I後面加上'\ b',否則它會匹配任何以I開始的單詞。'\ bI \ b'將會匹配'I'和'I'll'中的'I'。 – Sumurai8

+0

只有當兩者之間的模式都只是完整的單詞時,單詞邊界纔會起作用。如果不是,字邊界[將不夠普遍](http://goo.gl/u0C6qx)。 – acdcjunior

+0

兩個都是正確的,否則'\ s'將需要與一些正面/負面反向使用 – vol7ron

1

你需要使用lookaround for regex,使用這個正則表達式(?<=[iI])(\W.*)(?=disagree),你會得到o只有我和不同意這個詞。

Example here

+0

JavaScript不支持隱藏斷言。 – Gumbo

+0

但我在JEdit中嘗試這個,這是工作。我認爲這些在JDK 1.6中得到修復? – Angga

+0

[JavaScript不是Java。](http://www.crockford.com/javascript/javascript.html) – Gumbo

相關問題