正则表达式 - 匹配不包含指定字符串文字的子字符串

时间:2013-08-07 18:21:50

标签: regex

使用正则表达式\*\*([^\*]*)\*\*,我可以匹配**内的多组文字,例如:

this **is** a **test**

返回is& test

给定字符串that's **right * a test**,如何调整表达式以返回right * a test?如何让我的表达式排除两个*而不是一个?

http://regex101.com/r/aD3pC2

5 个答案:

答案 0 :(得分:8)

您可以使用不情愿的量词.*?

\*\*.*?\*\*

假设你的正则表达式引擎支持它。

答案 1 :(得分:1)

使用or

\*\*((?:[^*]|\*[^*])*)\*\*

在匹配组中,这将匹配任何不是星形的角色,或者跟随非星形的星形。假设双星(**)的第一个出现信号表示字符串文字的结尾。如果字符串内容以星号结尾(如**my string ends with a star***),则我的正则表达式不会包含匹配中的最终星号(因此字符串内容将只是“my string ends with a star”)。但我认为这是有效的,如上所述。

但是如果字符串文字以类似***Star Power!**的星号开头,它会在字符串内容中包含星号,我认为这也是有效的,因为**的第一次出现标志着字符串文字,以下单个*只是内容的一部分。

另外,请注意,您不需要在角色类中转义星号(在大多数实现中)。

答案 2 :(得分:1)

为了避免所有讨厌的逃避,我将使用这个正则表达式:

([*][*])(.*?)\1

抓住匹配的组#2。

现场演示: http://www.rubular.com/r/hJY1eXnLty

答案 3 :(得分:0)

您可以使用此模式:

 \*\*((?:[^*]|[^*]\*[^*])*)\*\*

它将匹配任意一对*个字符,后跟除*以外的任何字符中的零个或多个,或*以外的字符所包围的*,另一对*字符。

答案 4 :(得分:0)

如果您不想使用不情愿的量词,您可以使用:

\*\*((?:[^*]|[*](?=[^*]))+)\*\*

说明:这将匹配“*”或“*”以外的任何字符,但在“**”对之间没有后跟'*'