2016-11-15 198 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

它无法完成,因为它的客户端必须能够在任何他们想要的配置。这是我需要匹配的一个字符串。 –