首页 > 解决方案 > 如何匹配所有内部星号,它们之间没有空格

问题描述

我想匹配两个星号之间的所有字符串,在开头或结尾没有空格,我也不想只匹配星号文本。

例如:

* text* //don't match
******** //don't match
*text * //don't match
* text * //don't match
*  text* //don't match
*text* //match
*Hello World !* //match

我努力了:

(?<=\*)(?!\s)(.*?)(?!\s)(?=\*)

但它只在开始时在空间上工作,如您所见:https ://regex101.com/r/Hpe0br/3/

标签: javascriptregex

解决方案


尝试使用否定字符集,而不是否定的环顾四周:[^\s*]将匹配任何不是空格字符或星号的字符。将其添加到开头和结尾,就在后视和前瞻之间。另外,您可能不想要(.*?),因为s.也会不受欢迎地匹配*s:

(?<=\*)[^\s*](?:[^*]+[^\s*])?(?=\*)

https://regex101.com/r/Hpe0br/6

内部组(?:[^*]+[^\s*])?是可选的,以允许单字符匹配,例如*a*.

另请注意,如果您使用的是 Javascript,lookbehind 是一个相当新的功能 - 没有旧浏览器支持它,而且它不可转换。您可以考虑匹配*s 并捕获组中 s 之间的文本*

\*([^\s*](?:[^*]+[^\s*])?)\*

您想要的子字符串将位于第一个捕获的组中。

https://regex101.com/r/Hpe0br/7


推荐阅读