Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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/0/amazon-s3/2.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
Regex “如何支持引用”;“内部”;正则表达式中的选择(())?_Regex - Fatal编程技术网

Regex “如何支持引用”;“内部”;正则表达式中的选择(())?

Regex “如何支持引用”;“内部”;正则表达式中的选择(())?,regex,Regex,如何在正则表达式中反向引用内括号? 样本数据是一个产品价格表,根据购买数量显示不同的价格折扣。格式为quantityLow-quantityHigh:pricePer;倍数 我使用LINQPad构建了这个C#Regex表达式来分离各个部分,这显示了一个方便的Regex数据分离可视化。在本例中,有“内部”括号(选择),创建了一个层次数据结构 string mys = "1-4:2;5-9:1.89"; Regex.Matches (mys, @"((\d+)[-|\+](\d*):(\d+\.?\

如何在正则表达式中反向引用内括号?

样本数据是一个产品价格表,根据购买数量显示不同的价格折扣。格式为quantityLow-quantityHigh:pricePer;倍数

我使用LINQPad构建了这个C#Regex表达式来分离各个部分,这显示了一个方便的Regex数据分离可视化。在本例中,有“内部”括号(选择),创建了一个层次数据结构

string mys = "1-4:2;5-9:1.89";
Regex.Matches (mys, @"((\d+)[-|\+](\d*):(\d+\.?\d*);?)").Dump();  // Graphically show
这可以分解为(匹配就是一切。在匹配中,有单个匹配和组匹配。组匹配中有几个单个匹配。)

  • MatchCollection(2项)
    • 小组收集(4项)
      • CaptureCollection(1项)(“1-4:2”组
      • CaptureCollection(1项)(“1”组
      • CaptureCollection(1项)(“4”组
      • CaptureCollection(1项)(“2”组
    • CaptureCollection(1项)()匹配“1-4;2
    • 小组收集(4项)
      • CaptureCollection(1项)(“5-9:1.89”组
      • CaptureCollection(1项)(“5”组
      • CaptureCollection(1项)(“9”组
      • CaptureCollection(1项)(“1.89”组
    • CaptureCollection(1项)()匹配“5-9:1.89”
仅供参考:

  • ()括号组找到了可由\1..\9引用的结果(我想)
  • \d匹配一个数字。后面的+匹配一个或多个数字。*后匹配零个或多个数字?之后说这场比赛是可选的
  • 。匹配单个字符。\。在这种情况下匹配句点或小数点

    • 只需使用
      \1
      <代码>\9(或者在某些正则表达式实现中,
      $1
      $9
      )与您通常的做法相同。编号是从左到右的,基于打开组的位置(因此嵌套组的编号高于嵌套组的编号)。

      作为旁注,字符类始终匹配单个字符,“普通”元字符不适用于它们。因此,类
      [-\+]
      与三个字符
      -
      +
      中的一个匹配。如您所见,逻辑或元字符在字符类中没有特殊含义。您不需要在character类中转义
      +
      字符,因此应该这样做:
      [-+]

      注意,这是对Zim博士评论的回复:


      奇怪的是,这两种方法似乎都很有效。我选择了“监管者”,它至少显示了正则表达式是如何分解的。如果它有一个设置实现的功能,我想我是在做生意

      但我的回答太长,无法放在评论框中

      不,您不需要转义加号,在本例中是连字符。在字符类中,以下字符具有特殊含义:
      ]
      ^
      -
      。这三个字符是可能需要转义的唯一字符(请注意,
      [
      不需要转义!)。我说可能是因为它取决于这些元字符出现的位置。
      ^
      只有一个特殊的含义(作为一个否定指示符)当放置在字符类的开头时,它不需要转义,只需匹配文本
      ^

      [^a]   // special meaning: matches any character except 'a'
      [a^]   // matches 'a' or '^'
      [\^a]  // matches '^' or 'a'
      
      而连字符仅在不位于字符类的开头或结尾时才具有特殊含义(作为范围指示器)。例如:

      [a-c]  // special meaning: matches 'a', 'b' or 'c'
      [ac-]  // matches 'a', 'c' or '-'
      [-ac]  // matches '-', 'a' or 'c'
      [a\-c] // matches 'a', '-' or 'c'
      
      毫无疑问,一些正则表达式的实现可能与我刚刚发布的有所不同,但大多数语言都会遵守这些规则(至少我使用过所有语言!)。正如您所注意到的,在字符类中过度转义字符是安全的:它不会造成任何伤害。类
      [+]
      [\+]
      将匹配文本
      +
      。嗯,第一个是首选的,因为我发现一个包含太多转义的正则表达式很难读取。但是一些人会不同意我的观点,并发现通过使用转义(虽然不是必需的),文本
      +
      将被匹配,而不是贪婪的量词


      希望这能把事情弄清楚。

      \k
      在命名组太多的情况下反引用命名组
      (?…)
      。任何人都有使用自动编号(标识)进行命名反引用的示例代码吗?类似于(?[1-8]…)的代码,其中包含名称1、名称2、名称3、名称4等。在研究了这一点之后,我同意管道没有“或”,但您是否仍然需要在类括号中“引用”减号和加号?例如:/^[\d\s()\-\+\/]*$/将匹配电话号码714/921-5424(VisiBone图表中的示例),或者此实现依赖于此?奇怪的是,这两种方式似乎都很好。我选择了“调节器”这至少显示了正则表达式是如何分解的。如果它有一个设置实现的功能,我想我是在做生意。请注意,类
      /^[\d\s\(\)\-\+\/]*$/
      相当于
      /^[\d\s()+\/-]*$/
      这个答案已添加到“字符类”下的。