2017-08-31 10 views
3

我想加时赛让我的头环绕这个相当长的一段时间,但似乎我不能......正则表达式中找到的每个字就像__word__

我想匹配像__MY_WORD__ 的模式事情是它可能在同一个字符串上有多个模式。

我已经试过类似:

for string: "__key1__message1__key2__message2" regex: "__[^_]*__"

正常工作:{:match, [['__key1__'], ['__key2__']]}

,但只要我添加下划线的“钥匙”惹它的一切行动...

for string: "__key_1__message1__key2__message2" regex: "__[^_]*__"

结果是完全不同的:{:match, [['__message1__']]}

+0

也许你可以使用['__。*?__'](https://regex101.com/r/gRwZld/1) – Aaron

+0

@Aaron这与我发布的内容非常相似,但效率较低。我将细节添加到我的答案中。 –

+0

@WiktorStribiżew是啊,我在你身边回答的同时评论说,我同意你的解决方案是更好的 – Aaron

回答

5

使用

__[^_]*(?:_[^_]+)*__ 

regex demo

其实,这是一个unrolled__.*?__格局,也跨行匹配,并且是更有效,因为.*?由字符扩展字符,否定字符类一次抓取文本的整个部分。

详细

  • __ - __
  • [^_]* - 任何0+字符以外_
  • (?:_[^_]+)* - 的
    • _连续零个或多个 - 一个_
    • [^_]+ - 比_
  • __其它任何一个或多个字符 - __

基本上,它匹配__,然后比_其他,任何字符然后任意数量的_ +非_ s,然后__