javascript 在使用Regex进行匹配时,如何忽略字符串中的前x个字符(不使用look behind)?

qvsjd97n  于 2023-05-16  发布在  Java
关注(0)|答案(2)|浏览(99)

我正在尝试创建一个捕获以下字符串的正则表达式:

returnedData=dfsavdasvfdvdvvjwfwhvfwjhfvwjhevfwjvfw04040000N.sdfsgs.sfgakhvsafjhafj  ksajbd   234.234 bfsdf  sudhfkusa   77907 23 gfksahgkf bkhkjakjsf - CB123214124

但我希望在中间的数字(04040000)之后捕获它。问题是我使用的正则表达式是把它作为一个整体来捕获的:

(returnedData)+([A-Za-z0-9=:\s\-@+?\.])*(-\s)(CB)

我想要捕获的字符串是:N.sdfsgs.sfgakhvsafjhafj ksajbd 234.234 bfsdf sudhfkusa 77907 23 gfksahgkf bkhkjakjsf - CB

这必须在不支持Lookbehind的IBM LogDNA中使用。因此,限制。需要在YAML文件中输入正则表达式,因此不接受任何代码,只能使用正则表达式

gcuhipw9

gcuhipw91#

使用这种模式

returnedData\s*=\s*\D+\d++([A-Za-z0-9=:\s\-@+?\.]+\s*-\s*CB)

如果你使用的是JS,你可以匹配字符串并使用第一个组,就像我在console.log()中使用的那样:

str="returnedData=dfsavdasvfdvdvvjwfwhvfwjhfvwjhevfwjvfw04040000N.sdfsgs.sfgakhvsafjhafj  ksajbdfksabfkasbfsdf  sudhfkusagfksahgkf bkhkjakjsf - CB123214124"
let matched = str.match(/returnedData\s*=\s*\D+\d+(\D[A-Za-z0-9=:\s\-@+?\.]+\s*-\s*CB)/);
console.log(matched[1]);

结果是:
N.sdfsgs.sfgakhvsafjhafj ksajbdfksabfkasbfsdf sudhfkusagfksahgkf bkhkjakjsf - CB

dfty9e19

dfty9e192#

您可以修改正则表达式以使用肯定的后向Assert,该Assert仅在前面有数字“04040000”时才匹配“-”字符序列。下面是修改后的正则表达式:

returnedData=[A-Za-z0-9=:\s\-@+?\.]*?(?<=04040000\s- )CB\S+

说明:

  • returnedData=匹配文字字符串“returnedData=”
  • [A-Za-z0-9=:\s\-@+?\.]*?匹配可能出现在目标字符串之前的任何字符。*?使量词变得懒惰,以便它匹配满足模式其余部分所需的最小字符数。
  • (?<=04040000\s- )是一个肯定的后看Assert,只有在前面有“04040000”时才匹配“-”序列。
  • CB\S+匹配文本字符串“CB”,后跟一个或多个非空格字符(目标字符串)。

请注意,\S字符类匹配任何非空格字符。如果要在目标字符串中包含空格,可以将\S+替换为[A-Za-z0-9\s]+

相关问题