我有以下regexp:
/^(?:(?:>|<)?[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是否可以将此限制添加到regexp?
我能想到的两种方法是:
如果第一个字符为<
< (或如果字符串中再次出现< ),则使第二个实例无效),如果是,则使第二个实例无效。但是,我不确定如何在这里实现这两种方法。
发布于 2018-06-04 00:35:47
您可以在插入符号^之后使用非常早的否定先行检查
(?!<[^<\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)?)?)?$发布于 2018-06-04 00:54:08
只需用(?:(?:>|<(?!.*<))?替换(?:(?:>|<)?即可获得所需的结果。
测试它,。
如果您还想将此特性从<字符扩展到>字符,则可以将模式(?:(?:>|<)?的相同部分替换为(?:([<>])(?!.*\1))?,并将模式的第二部分中的<?替换为[<>]?。
测试它,。
https://stackoverflow.com/questions/50668176
复制相似问题