3

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

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

返回is& test

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

http://regex101.com/r/aD3pC2

4

5 回答 5

8

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

\*\*.*?\*\*

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

于 2013-08-07T18:28:19.287 回答
1

使用or

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

在匹配组中,这将匹配任何不是星号或星号后跟非星号的字符。假设双星 ( ) 的第一次出现表示字符串文字**的结束。如果字符串内容以星号结尾(如**my string ends with a star***),我的正则表达式将不会在匹配中包含最后一个星号(因此字符串内容将简单地为“ my string ends with a star”)。但我认为正如刚才所描述的那样是有效的。

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

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

于 2013-08-07T18:27:22.230 回答
1

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

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

并抓住匹配组#2。

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

于 2013-08-07T18:36:20.860 回答
0

如果你不想使用不情愿的量词,你可以使用这个:

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

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

于 2013-08-07T18:44:28.407 回答
0

你可以使用这种模式:

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

它将匹配任何一对*字符,后跟零个或多个除 之外的任何字符*或被除 之外*的字符包围的字符*,然后是另一对*字符。

于 2013-08-07T18:28:11.360 回答