匹配带有前导或尾随星号的行的正则表达式

Regex that matches lines with a leading or trailing asterisk

我需要匹配以单个星号字符开头或结尾的每一行,中间没有任何其他星号。

1.- foo BAR, FOO1*

2.- *FOO, bar% foo

3- *foo). BAR", fOo*

4.- **foo BAR foo

5.- *foo bar foo**

6.- foo bar * foo

7.- foo bar foo

我要匹配1到3行,其他行我不匹配。

我的方法:

^[\*](?:[a-zA-Z0-9.!#$%&'+/=?^_`{|}~-\s])|^[a-zA-Z0-9.!#$%&'+/=?^_`{|}~-\s]+.\*$

但并非在所有情况下都有效。

为什么这么复杂?尝试:

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

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

基本上,你有两种情况(第一种情况|第二种情况)在上面的正则表达式中表达的匹配项:

  1. 字符串以星号 ^\* 开头,不包含星号 [^*]*,并以一个或零个星号结尾 \*?$
  2. 字符串不包含任何星号 ^[^*]* 除了最后一个字符 \*$

如果字符串中间不需要任何星号 - 使用 Pierre François 答案。

如果字符串中间接受星号,试试这个:

var tests = [
"foo BAR, FOO1*",
"*FOO, bar% foo",
'*foo). BAR", fOo*',
"**foo BAR foo",
"*foo bar foo**",
"foo bar * foo",
"foo bar foo"];

var regex = /(^\*(?!\*).*(?<!\*)\*?$)|(^\*?(?!\*).*(?<!\*)\*$)/;


tests.forEach(t => console.log(regex.test(t)));