匹配 * 内的所有内容,没有空格

match everything inside of * with no whitespaces

我希望正则表达式具有以下行为:

*test and test* -> match ok
* test and test* -> match NOT ok
*test and test * -> match NOT ok
* test and test * -> match NOT ok

我正在使用这个正则表达式让它工作:\*[^\s](.*?)[^\s]\*
但问题是,在第 1 组中,它删除了第一个和最后一个字母,所以我没有匹配 test and test,而是 est and tes,我需要同时保留第一个和最后一个字母单词之间也有空格

那是因为[^\s]实际匹配的是一个字符,有2个所以匹配(不是捕获)2个字符。

否定字符 class 应该在星号之后的捕获组内,并重复 1 次或多次以不匹配空字符串。

如果您也想排除匹配星号 [^\s*] 并匹配 * 中的所有内容,而不需要前导或尾随空格:

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

部分模式:

  • \* 匹配 *
  • ( 捕获 组 1
    • [^\s*]+ 匹配 1+ 次除空白字符或 *
    • 以外的任何字符
    • (?:\s+[^\s*]+)* 可选择重复 1+ 个空格和第一个字符 class
  • ) 关闭组 1
  • \* 匹配 *

Regex demo

你的捕获组中没有第一个和最后一个字母(用括号表示)。

试试这个:\*([^\s].*?[^\s])\*