【问题标题】:Regular expressions: validate that string only contains instances of pattern正则表达式:验证字符串仅包含模式实例
【发布时间】:2019-12-06 09:45:05
【问题描述】:

我正在尝试创建一个仅在字符串包含某些模式的实例时才匹配的正则表达式。假设我只需要一个由空格分隔的“foo”或“bar”子字符串组成的字符串。

因此,有效实例是:“foo”、“bar”、“foo foo”、“foo bar”、“foo foo bar”、“foo bar foo bar”... 无效实例:“foofoo bar”、“baz foo bar”、“foo bar baz”

因此,foo 或 bar 的每个实例(即我的基本模式或捕获组)应该以空格开头或在字符串的开头,并且应该以空格结尾或位于字符串的结尾。

这似乎是一个简单的任务,但我想不通。

这是我目前得到的:

(?:^|bar\s|foo\s)(foo|bar)(?=$|\sbar|\sfoo)

它在“foofoo bar”上不起作用(不知何故它是有效的)。

我正在用 Python 测试它。但如果它也能在 JS 中工作就更好了。

【问题讨论】:

  • 你似乎想匹配空格分隔的模式,^(?:foo|bar)(?: (?:foo|bar))*$
  • Wiktor Stribiżew,谢谢,这很有效。我可以做任何事情来指定我的模式一次吗?我想使用复杂的模式。可以在这里应用命名组和 \g 吗?
  • 在下面查看我的答案。

标签: regex


【解决方案1】:

你可以使用类似的模式

^(?:foo|bar)(?: (?:foo|bar))*$

regex demo #1

如果您的正则表达式引擎支持递归模式,您可以使用

^(?<id>foo|bar)(?: (?&id))*$

regex demo #2

注意:

  • 如果您在匹配尾随换行时遇到问题,您需要调整字符串锚的结尾(请参阅this answer of mine
  • 如果您需要在条目之间允许任何 1+ 个空格字符,请使用 \s+。如果空格不应匹配换行符,请使用\h+[\p{Zs}\t]+。如果条目之间只能有 1 个空格,请删除 +
  • 要允许前导/尾随空格,请在^ 之后和$ 之前添加\s* / \h* / [\p{Zs}\t]*

【讨论】:

  • 谢谢。可以用 ECMA 脚本风格重现递归模式功能吗?我正在尝试修改您的示例,但它不起作用。
  • @RayP。 ECMAScript 不支持递归。如果你在 JS 工作,只需build the pattern dynamically
  • 不幸的是,我必须在 JSON 模式中使用这种模式,所以我无法动态构建它。尽管如此,感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2011-06-27
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多