2016-11-15 191 views
2

的第一個和最後一個字符我有以下字符串: word_word2_word3_word4正則表達式來排除匹配

我的本意是隻提取「test2的」。使用_\w*?_作爲字符串匹配,我可以得到'word2'作爲匹配,但我看不到刪除那些下劃線以匹配'word2'的方式。

我不能使用.split()或類似的東西,這個值必須使用正則表達式來收集。

你有什麼修改建議傢伙?

+0

爲什麼不使用String.split( 「_」)[1]? – 11thdimension

+0

不能做String.split(「_」)[1],因爲它會被客戶端解釋,並且它必須是可配置的。 –

+0

從這個問題我假設你需要第二個字。您將使用'split'對代碼進行哪些修改,您無需使用Regex進行編碼? – 11thdimension

回答

3

您還可以使用積極的前瞻和回顧後

(?<=_)\w*2(?=_)

我的本意是隻提取 'test2的'。使用\ w *?作爲字符串匹配,我可以得到'word2'作爲匹配,但我不能看到刪除這些下劃線只匹配'word2'的方式。

下劃線不會是MACHING字符串的一部分,但將其前後

編輯:

的進一步深入,如果匹配字符串是對整個文本的開頭或結尾,它不會被下劃線包圍。

(?<=_|^)[^_]*2(?=_|$)

這一項,使得可選在這種特定情況下使用下劃線。

online test

+0

工作就像一個魅力!謝謝! :) :) –

+0

爲什麼你在你的正則表達式中有'2'。如果輸入是'abc_foo_pqr_bar',怎麼辦? – anubhava

+0

用戶要求將文本與「2」('test2')進行匹配。如果情況是'abc_foo_pqr_bar',那麼將不會匹配... –

1

您的問題並不完全清楚,但假設word2,word3等是不包含_的任意字,您可以使用捕獲組來提取想要提取的字符的子集。例如:

\w*_(\w*)_\w*_\w* 

那你的字符串,第一個(也是唯一一個)捕獲組匹配提取的第二個字。也許*應該是+,這取決於您是否要接受零大小的單詞。

+0

你好@BeeOnRope,謝謝你的建議。不幸的是,如果我使用你的正則表達式匹配所有的字符串。我只想要沒有任何下劃線的「word2」。你有任何修改嗎? –

+0

_want_是什麼意思?上面的代碼與整個字符串相匹配,但是在查詢第一個匹配的組時(部件'(\ w *)''),_只給出'word2'。如果你關心_matching_,你可以使用lookahead和lookbehind的組合。 – BeeOnRope

+0

我用過http:// regexr。com /,將這個正則表達式應用於word1_word2_word3_word4字符串,它匹配所有這些,而不僅僅是word2。 –

0

如果你不擔心表演會快速和骯髒的方式將刪除比賽的第一個和最後一個字符。

+0

它無法完成,因爲它的客戶端必須能夠在任何他們想要的配置。這是我需要匹配的一個字符串。 –