是否无法在JavaScript中使用多行正则表达式模式指示输入字符串的开头?

时间:2012-03-10 17:04:33

标签: javascript regex multiline

在JavaScript中,multiline flag更改了^$的含义:

  

将开始和结束字符(^和$)视为多行(即匹配每行的开头或结尾(由\ n或\ r分隔),而不仅仅是整个输入的开头或结尾)字符串)

嗯,有了图片中的那些字符,是否有任何其他方法来标记输入字符串的开头?如何在输入字符串的开头指示我希望我的多行模式匹配?

我知道我可以使用返回值index的{​​{1}}属性来检查匹配的索引,但有没有办法防止正则表达式引擎在第一个字符串中搜索整个字符串放置?

3 个答案:

答案 0 :(得分:2)

不,^是测试输入开始的唯一built-in assertion,正如您所说,其行为由multiline标志修改。

你可以在你正在测试的字符串的开头和正则表达式的开头放一些唯一的字符串,但这有点像黑客。在正常情况下,正如您所说,您将测试返回匹配的索引。

答案 1 :(得分:1)

不,JavaScript不像大多数其他版本那样支持绝对锚点(\A\Z\z)。但你确定你需要它们吗?字符串的开头通常是必须使用锚点的唯一位置。每个后续行由其前面的换行符自动“锚定”。

我建议您删除多行标记,并确保明确使用所有换行符。我知道那有点模糊;如果您要提供代码示例和/或告诉我们您要解决的问题,我们可能会做得更好。

答案 2 :(得分:0)

在 2021 年,随着支持 RegExp 中的后视构造的 ECMAScript 2018+ 标准的日益普及,您现在可以在多行模式正则表达式中使用“绝对”、明确的字符串位置开始,如果您使用

/^(?<![^])/gm

虽然 g 标志允许多重匹配,m 允许 ^ 匹配任何行的起始位置,但 ^(?<![^]) 模式只匹配

  • ^ - 一行的开始
  • (?<![^]) - 在它的左边没有字符。 [^] 匹配 ECMAScript 正则表达式中的任何字符。

替代方案

/^(?<![\w\W])/gm
/^(?<!.)/gsm

其中 [\w\W] 匹配任何字符,包括换行符([\s\S][\d\D] 的同义构造),/s 标志使 . 能够识别换行符。

查看 JavaScript 演示:

const regex = /^(?<![^])/gm; // g - multiple matching enabled!
const text = 'Line 1\nLine 2\nLine 3';
console.log(text.replace(regex, 'INSERTION...')); // Only the first line affected
// => INSERTION...Line 1
//    Line 2
//    Line 3