首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据第一个字符或先前出现的字符限制部分模式

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

Stack Overflow用户
提问于 2018-06-03 23:47:50
回答 2查看 66关注 0票数 2

我有以下regexp:

代码语言:javascript
复制
/^(?:(?:>|<)?[a-zA-Z]+(?:(?:\+|-)\d*\.?\d*(?:em)?)?)(?:<[a-zA-Z]+(?:(?:\+|-)\d*\.?\d*(?:em)?)?)?$/

你可以这样想:

代码语言:javascript
复制
^
  (?:
    (?:>|<)?
    [a-zA-Z]+
    (?:(?:\+|-)\d*\.?\d*(?:em)?)?
  )
  (?:
    <
    [a-zA-Z]+
    (?:(?:\+|-)\d*\.?\d*(?:em)?)?
  )?
$

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

因此,以下内容都是有效的:

代码语言:javascript
复制
  `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`,

我的问题是,如果第一个实例以<开头,那么第二个实例就不应该被允许,所以下面的代码应该是无效的:

代码语言:javascript
复制
<alpha<bravo

是否可以将此限制添加到regexp?

我能想到的两种方法是:

如果第一个字符为<

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 00:35:47

您可以在插入符号^之后使用非常早的否定先行检查

代码语言:javascript
复制
(?!<[^<\s]*<)

Live demo

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

扩展模式:

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

在一行中:

代码语言:javascript
复制
^(?!<[^<\s]*<)(?:[<>]?[a-zA-Z]+(?:[-+]\d+(?:\.\d+)?(?:em)?)?)(?:<[a-zA-Z]+(?:[-+]\d+(?:\.\d+)?(?:em)?)?)?$
票数 3
EN

Stack Overflow用户

发布于 2018-06-04 00:54:08

只需用(?:(?:>|<(?!.*<))?替换(?:(?:>|<)?即可获得所需的结果。

测试它,。

如果您还想将此特性从<字符扩展到>字符,则可以将模式(?:(?:>|<)?的相同部分替换为(?:([<>])(?!.*\1))?,并将模式的第二部分中的<?替换为[<>]?

测试它,。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50668176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档