【问题标题】:Regex: capture between delimiters, with optional end delimiter正则表达式:在分隔符之间捕获,带有可选的结束分隔符
【发布时间】:2020-04-06 00:09:36
【问题描述】:

我有以下字符串类型:

- Lorem ipsum - dolor sit amet
- Lorem ipsum - dolor sit: amet
...
1. Lorem ipsum - dolor sit amet (1.5)
2. consectetur: adipiscing elit (4.5)
...

括号之间有两位数字的部分是可选的,所以......我如何捕获列表标记(“-”或“1.”,“2.”等)和开始之间的部分第一个括号 " (" 带有单个正则表达式?在 Javascript 中。

到目前为止我已经尝试过:

[a-z](.*)(?=\s\()

从“1. Lorem ipsum dolor sit amet (1.5)”中捕获“Lorem ipsum dolor sit amet”。

谢谢!

编辑:

被测试的字符串还可以包含“:”和“-”字符。

【问题讨论】:

  • 试试text.match(/^(?:-|\d+\.).*(?:\r?\n(?!-|\d+\.).*)*/gm)
  • @WiktorStribiżew 不起作用

标签: javascript regex


【解决方案1】:

你可以使用

/^(?:-|\d+\.)\s*(.*?)(?:\s*\([^()]*\))?$/gm

请参阅regex demo。如果文本是单行文本,去掉末尾的m

详情

  • ^ - 行/字符串的开始
  • (?:-|\d+\.) - 一个 - 或 1+ 个数字和一个 .
  • \s* - 0+ 个空格字符
  • (.*?) - 第 1 组:除换行符以外的任何 0+ 个字符
  • (?:\s*\([^()]*\))? - 0+ 空格、(、除 () 之外的任何 0+ 字符、) 的可选序列
  • $ 字符串/行结束。

JS 演示:

var text = '- Lorem ipsum - dolor sit amet\n- Lorem ipsum - dolor sit: amet\n..\n1. Lorem ipsum - dolor sit amet (1.5)\n2. consectetur: adipiscing elit (4.5)';
var rx = /^(?:-|\d+\.)\s*(.*?)(?:\s*\([^()]*\))?$/gm;
var m, result=[];
while(m=rx.exec(text)) {
  result.push(m[1]);
}
console.log(result);

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2017-07-27
    • 1970-01-01
    • 2020-09-16
    • 2014-01-28
    相关资源
    最近更新 更多