【问题标题】:Regex that matches lines with a leading or trailing asterisk匹配带有前导星号或尾随星号的行的正则表达式
【发布时间】:2020-05-27 22:05:08
【问题描述】:

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

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]+.\*$

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

【问题讨论】:

  • 你的正则表达式不包含行号。 3
  • 如果您检查了更新的内容,它会这样做,或者我错过了什么?我不应该删除领先的1. - 部分吗?那是字符串的一部分?
  • @Eraklon 前导 '1.- , 2.-...' 部分不是字符串的一部分,是示例的数字行。它工作正常!非常感谢!!
  • 您在上面说:“我需要匹配以单个星号字符开头或结尾的每一行(原文如此)”但是在您提供的示例中,我们可以推断出有更多条件。说“我需要匹配以单个星号字符开头或结尾的每一行,中间没有任何其他星号”不是更正确吗?

标签: javascript regex regex-negation


【解决方案1】:

如果字符串中间也不需要任何星号 - 使用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)));

【讨论】:

  • 我得到:"message": "SyntaxError: invalid regexp group",。请注意,并非所有浏览器都支持lookbehind。这不应该在生产中使用。
【解决方案2】:

为什么会有这样的并发症?试试:

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

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

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

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

【讨论】:

  • 如果字符串中间有 * 看起来应该会失败,这是有效的..
  • @CristianTraìna:您提出的解决方案与输入的第三行不匹配,即以星号开头的行
  • @YosefTukachinsky:中间的星号无效。请参阅上面的输入第 6 行:不允许匹配。
  • *kkk*kk这样的输入应该是有效的
  • @YosefTukachinsky:我们应该向 PO 询问。由于**kkkkk 无效,我想*kkk*kk 无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2022-07-27
  • 1970-01-01
  • 2018-03-07
  • 2019-06-20
  • 2016-01-23
相关资源
最近更新 更多