使用正则表达式捕获包含在字符串中的子字符串

问题描述

希望你没事。

我无法单独使用正则表达式(在 JavaScript 中)解决我的问题。

我有以下字符串:

例 1:

error Lorem Ipsum warning dummy text info one more example for test error Another issue

例 2:

error Lorem1 Ipsum1 error Lorem2 Ipsum2

对于这两种情况,我想将文本分成 4 或 2 组:

例 1:

error Lorem Ipsum
warning dummy text
info one more example for test
error Another issue

例 2:

error Lorem1 Ipsum1
error Lorem2 Ipsum2

我很确定解决方案并不复杂。

目前我能够捕获关键字和第一个字符,但不能捕获所有字符(未定义字符数量)。

/((warning|error|info)(?:(^warning|error|info)*...))/gisu

结果是:

error Lo
warning th
info Lo
error An

Regex101 页面https://regex101.com/r/O9Jz5B/1

感谢您的帮助。

解决方法

在您尝试的模式中,这部分 (?:(^warning|error|info)*...) 表示匹配字符串开头的 warning 的可选重复(无法匹配,因为您不在字符串的开头) ,或匹配 error 或匹配 info

然后匹配任意字符 3 次。

由于前 3 个选项后的后 3 个选项不匹配,因此只有 3 个字符 ... 匹配,您会得到类似的匹配

error Lo
     ^^^

你可能会使用

\b(?:warning|error|info)\b.*?(?=\s*\b(?:warning|error|info|$)\b)
  • \b(?:warning|error|info)\b 匹配单词边界之间的备选方案 1
  • .*? 尽可能匹配
  • (?= 正向前瞻,断言直接向右
    • \s* 匹配可选的空白字符
    • \b(?:warning|error|info|$)\b 匹配备选方案之一或断言字符串的结尾
  • ) 关闭前瞻

Regex demo

const regex = new RegExp("\\b(?:warning|error|info)\\b.*?(?=\\s*\\b(?:warning|error|info|$)\\b)",'gm')
const str = `error Lorem Ipsum warning dummy text info one more example for test error Another issue
error Lorem1 Ipsum1 error Lorem2 Ipsum2
`;
console.log(str.match(regex));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...