我有以下正则表达式:
/^(?:(?:>|<)?[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
是否可以将此限制添加到正则表达式中?
我能想到的两种方法是:
- 检查第一个字符,如果是
<
则使第二个实例无效 - 检查是否
<
已在字符串中出现(或者如果<
在字符串中再次出现),如果是,则使第二个实例无效。
但是我不确定如何在这里实现这两种方法。
最佳答案
您可以在插入符号 ^
之后使用非常早的否定前瞻:
(?!<[^<\s]*<)
您也不需要使用交替来一次匹配单个字符,即 (?:>|<)
应该是[<>]
或(?:\+|-)
应该是[+-]
.
扩展模式:
^
(?!<[^<\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/