Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建与字符串中的要求匹配的正则表达式 问题_Php_Regex_Expression - Fatal编程技术网

Php 创建与字符串中的要求匹配的正则表达式 问题

Php 创建与字符串中的要求匹配的正则表达式 问题,php,regex,expression,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}{

我需要编写一个正则表达式,它将在结构为{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}
  • {B/W}
我的尝试 这是我到目前为止得到的,但在所有UGWRB组合中,我只得到了14个匹配中的8个


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

为了完成任务,您必须同时处理负面和正面的外观:

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

请注意,应设置
m
标志

正则表达式细分:

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

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

说明:

  • ^
    -匹配字符串的开头
  • (?!.{([UGWRB])\/\1}
    -负向前看,以确保字符串中的任何位置都不存在类似
    {G/G}
    {U/U}
    {R/R}
    的结构
  • {
    -匹配
    {
  • (?(?=[UG])。\/[UGWRB]\/[UG])
    -如果当前位置后跟
    U
    G
    ,则匹配该字符后跟
    //code>和字符类
    [UGWRB]
    。否则,匹配字符类
    [WRB]
    后接
    /
    后接
    U
    G
  • }
    -匹配
    }
  • +
    -匹配上述子序列
    (?:{(?=[UG])。\/[UGWRB].[WRB]\/[UG]))的1+个匹配项。
  • $
    -匹配字符串的结尾

你没有在任何地方合并
WRB
。为什么
{W/G}{U/B}
是无效的?@abracadver你是什么意思?@revo这是个错误,对不起。为什么要把这么复杂的东西塞进一个正则表达式中呢?如果您拆分字符串并处理其每个子组件,您的代码将更清晰、更简单、更易于维护。标记为解决方案是因为1)工作正常2)比regex101中的其他解决方案稍快,3)比其他解决方案更易读。谢谢,这正按预期工作,然而,另一个答案是更快更干净。很抱歉迟了答复。