【问题标题】:How do I include an inline comment in a regular expression in JavaScript [duplicate]如何在 JavaScript 的正则表达式中包含内联注释 [重复]
【发布时间】:2012-11-05 14:42:28
【问题描述】:

当字符串传递给 RegExp 构造函数时,内联 cmets 起作用:

RegExp("foo"/*bar*/).test("foo")

但不是用表达式。 JavaScript 中是否有任何等效或替代方法来模拟 RegExp 对象的x-mode

【问题讨论】:

  • 在链接问题中查看我的makeExtendedRegExp 函数以模拟x 修饰符

标签: javascript regex comments emulation inline-code


【解决方案1】:

Javascript 既不支持 x 修饰符,也不支持内联 cmets (?#comment)See here.

我想,你能做的最好的事情就是使用RegExp 构造函数并将每一行写在单独的字符串中并将它们连接起来(在字符串之间使用 cmets):

RegExp(
    "foo" + // match a foo
    "bar" + // followed by a bar
    "$"     // at the end of the string
).test("somefoobar");

【讨论】:

  • 有没有可以投反对票的 cmets?
  • 这种解决方案我希望来自新手,而不是你@m.buettner!您没有更好的解决办法吗?
  • @Ωmega 好吧,我想它产生的开销比在每个正则表达式上运行正则表达式替换要少。另外,提出非黑客解决方案有什么问题?至少这个版本允许 cmets 中的任何字符串没有任何警告。
  • 我从未说过这是错误的,您的回答已被投票赞成。我只是说我期望的不仅仅是简单的解决方案......
  • @Ωmega 好吧,很抱歉让你失望了。
【解决方案2】:

除了使用长度为零的子表达式之外,这是不可能的。 “cmets”举例:

/[a-z](?!<-- Any letter)/

(?!..) 是一个否定的前瞻。如果前一个后面没有括号内的字符串,则匹配。因为(?!) 之间的东西是一个真正的正则(子)表达式,所以除非用反斜杠转义,否则不能使用任意字符

另一种方法是使用积极的前瞻:

/[a-z](?=|<-- Any letter)/

这种前瞻将始终匹配,因为显然a-z 后面也跟着一个空字符串。

【讨论】:

  • @m.buettner (?=|...) 就足够了。这意味着:匹配followed by "" OR followed by "..."。显然,第一个陈述是正确的,因此前瞻没有负面影响。
  • 好吧,这两个(我的和你的第二个变体)是等价的,我在你编辑第二个变体之前发表了我的评论;)。
  • 否定的前瞻版本是危险的,因为总是有机会,无论多么小,字符串将包含匹配后的注释,因此无法匹配。使用空字符串的积极前瞻是要走的路。
  • 您也可以使用(?:comment goes here){0},但这很棘手,因为使它成为评论的重要部分是{0},它位于最后,因此可能会被遗漏。
  • @MarkReed 这更容易出错/可读性更差,并且比我的回答中的两种前瞻方法使用更多的字符。我赞成您之前的评论,因为这是真的(尽管可能性很小,特别是如果先行后面跟着与先行本身相矛盾的东西)。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2021-10-07
  • 2020-02-06
相关资源
最近更新 更多