首页 > 解决方案 > 包含星号的匹配字符串

问题描述

我知道这听起来很容易,但我被困住了。
我想匹配带有星号的字符串*

本质上,我希望允许在前/后/两者都有星号但中间没有星号的字符串:(
最多会有 2 个星号,前面和两者但没有中间,并且存在字符串是必须的)

允许:

*字符串*
*字符串
字符串*
字符串

否定:

*str*ing*
*str*ing
str*ing*
str*ing
*string**
**
*

我试过了

^\\*?((?!\\*).)*\\\*?$

并以某种方式起作用。
有人可以解释这是如何工作的吗?
并验证这是否正确,因为 regex..hard to debug and check..

标签: phpregex

解决方案


您可以使用以下正则表达式:

^\*?\w+\*?$

演示:https ://regex101.com/r/vwuXv2/1/

说明:

  • ^锚强加一行的开头
  • \*?a*最多出现一次
  • \w+文本中至少出现 1 个单词字符([a-zA-Z0-9_] 可以根据需要随意更改)
  • \*?a*最多出现一次
  • $线锚的末端

现在,如果您对部分行匹配感兴趣,可以使用以下正则表达式:

(?<=^| )\*?\w+\*?(?=$| )

演示:https ://regex101.com/r/vwuXv2/2/

解释:你添加了lookbehind,lookahead断言。

根据评论中的要求添加日文字符(添加[^*\s]您需要从单词中排除的所有字符):

^\*?[^*\s]+\*?$

演示:https ://regex101.com/r/RaCmwt/1/

或者

^\*?[[:alpha:]]+\*?$ 

(启用 unicode 标志)或只是

^\*?\p{L}+\*?$

演示:https ://regex101.com/r/RaCmwt/2/


推荐阅读