javascript - 根据第一个字符或先前出现的字符限制模式的一部分

标签 javascript regex

我有以下正则表达式:

/^(?:(?:>|<)?[a-zA-Z]+(?:(?:\+|-)\d*\.?\d*(?:em)?)?)(?:<[a-zA-Z]+(?:(?:\+|-)\d*\.?\d*(?:em)?)?)?$/

你可以这样想:

^
  (?:
    (?:>|<)?
    [a-zA-Z]+
    (?:(?:\+|-)\d*\.?\d*(?:em)?)?
  )
  (?:
    <
    [a-zA-Z]+
    (?:(?:\+|-)\d*\.?\d*(?:em)?)?
  )?
$

这实际上是相同的模式重复一次或两次,但差异很小。每个模式的核心是一个或多个字母 [a-zA-Z]后跟一个可选的减号或加号以及一个数值,后可能跟 em 。第一个实例可以以 < 开头或>第二个实例只能以 < 开头.

因此以下内容均有效:

  `alpha`,
  `alphaBravo`,
  `alphaBravoCharlie`,
  `>alpha`,
  `<alpha`,
  `>alpha+10`,
  `<alpha+10`,
  `>alpha+1.5`,
  `<alpha+1.5`,
  `>alpha-10`,
  `>alpha-10`,
  `>alpha-1.5`,
  `>alpha-1.5`,
  `>alpha+10em`,
  `<alpha+10em`,
  `>alpha+1.5em`,
  `<alpha+1.5em`,
  `>alpha-1.5em`,
  `>alpha-1.5em`,
  `alpha-50em<delta-100em`,
  `alpha-50em<delta+100em`,
  `>alpha-50em<delta+100em`,

我的问题是,如果第一个实例以 < 开头那么不应允许第二个实例,因此以下内容应无效:

<alpha<bravo

是否可以将此限制添加到正则表达式中?

我能想到的两种方法是:

  1. 检查第一个字符,如果是<则使第二个实例无效
  2. 检查是否 <已在字符串中出现(或者如果 < 在字符串中再次出现),如果是,则使第二个实例无效。

但是我不确定如何在这里实现这两种方法。

最佳答案

您可以在插入符号 ^ 之后使用非常早的否定前瞻:

(?!<[^<\s]*<)

Live demo

您也不需要使用交替来一次匹配单个字符,即 (?:>|<)应该是[<>](?:\+|-)应该是[+-] .

扩展模式:

^
  (?!<[^<\s]*<) # We have this extra one
  (?:
    [<>]?
    [a-zA-Z]+
    (?:[-+]\d+(?:\.\d+)?(?:em)?)?
  )
  (?:
    <
    [a-zA-Z]+
    (?:[-+]\d+(?:\.\d+)?(?:em)?)?
  )?
$

在一行中:

^(?!<[^<\s]*<)(?:[<>]?[a-zA-Z]+(?:[-+]\d+(?:\.\d+)?(?:em)?)?)(?:<[a-zA-Z]+(?:[-+]\d+(?:\.\d+)?(?:em)?)?)?$

关于javascript - 根据第一个字符或先前出现的字符限制模式的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668176/

相关文章:

javascript - 在新窗口中访问 JavaScript 变量

javascript - Chrome开发者工具数组长度

javascript - 如何将dom元素传递给javascript函数?

javascript - 货币的正则表达式

javascript - ASP.NET 正则表达式验证器(密码强度)

javascript - 当子 prop 动态更改时,对象作为 React 子对象无效

javascript - 提交前复制表单输入字段的值

javascript - 提取 key :Value pairs assoc with regex from string on Javascript

C# - 在另一个字符串中查找一组字符串中的一个的最快方法

regex - Haskell 正则表达式非捕获组