php - 创建将匹配字符串中的要求的正则表达式

标签 php regex expression

问题

我需要编写一个正则表达式,以匹配结构为 {A/B} 的字符串中的以下要求。

要求/条件:

  • A 和 B 只能是 [UGWRB] 之一。
  • 未出现 U 或 G 的结构无效。
  • 两个字符相等的结构无效。
  • U 或 G 必须在组合中至少出现一次。
  • 该结构可以重复或继续无限次,只要后面的每个实例在单独读取时仍然有效。 (请参阅下面的有效匹配)

有效匹配:

  • {U/G}{U/G}{U/G}
  • {W/G}{U/B}
  • {U/G}{U/B}
  • {U/G}
  • {G/U}
  • {U/B}
  • ...

无效匹配:

  • {U/U}{U/U}
  • {U/U}{G/G}
  • {U/G}{U/U}
  • {U/G}{R/B}
  • {G/G}
  • {R/B}
  • {W/R}
  • {黑白}
  • ...

我的尝试

这是我到目前为止所得到的,但是在 UGWRB 的所有组合中,我只得到了 14 个匹配中的 8 个。

{([UG])(?(1)|\w)\/(?(1)\w|[UG])}

最佳答案

为了完成任务,您必须使用否定和肯定的前瞻:

^(?:{(?=[^{}]*[UG])([UGWRB])\/(?!\1)(?1)})+$

参见live demo here

请注意,应设置 m 标志。

正则表达式分割:

  • ^ 匹配输入字符串的开头
  • (?: 非捕获组的开始
    • { 按字面意思匹配 {
    • (?= 正向前瞻开始
      • [^{}]*[UG] 查找组合中的 [UG]
    • ) 前瞻结束
    • ([UGWRB]) 匹配并捕获字符类中的字母
    • \/(?!\1)(?1) 匹配 / 并查看下一个字符是否与最近捕获的字符不同
    • } 按字面意思匹配 }
  • )+ 组结束,至少重复一次
  • $ 匹配输入字符串的结尾

关于php - 创建将匹配字符串中的要求的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54095511/

相关文章:

PHP Codeigniter 上传失败,没有错误

php - 一组 2 个用户的 SQL 查询

带有竖线的 Java 正则表达式

regex - Sed 用新的目录结构替换行 "Linux Directory "

r - 在 R 中使用粘贴文本中的上标(对于多个值的向量)

php - 在数据库中插入行并更新其下面的行

php - 无法使用 PHP 从 AWS 读取 Gmail

regex - 在正则表达式中,什么是回溯/反向引用?

r - 将 R 中的多个表达式组合成一个大表达式

c# - 添加代表 : unexpected results when adding two Func<T, TResult>