Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Java 如何仅在字符在匹配中出现n次时进行匹配?_Java_Regex - Fatal编程技术网

Java 如何仅在字符在匹配中出现n次时进行匹配?

Java 如何仅在字符在匹配中出现n次时进行匹配?,java,regex,Java,Regex,我想匹配START:test:test:test:asd:xxx:yyy:zzz:12345:END,但仅当:出现4次或更多次时 一般来说,以下工作:(开始。*?)\d+(:结束) 但是我怎样才能进入:{4,} 匹配字符串可能会重复多次。比如:START:test:test:test:asd:xxx:yyy:zzz:12345:END…START:test:test:test:asd:xxx:yyy:zzz:12345:END… 重要的是,:{4,}匹配只应用于每个开始-结束标记内 旁注:我在这

我想匹配
START:test:test:test:asd:xxx:yyy:zzz:12345:END
,但仅当
出现4次或更多次时

一般来说,以下工作:
(开始。*?)\d+(:结束)
但是我怎样才能进入:{4,}

匹配字符串可能会重复多次。比如:
START:test:test:test:asd:xxx:yyy:zzz:12345:END…START:test:test:test:asd:xxx:yyy:zzz:12345:END…
重要的是,
:{4,}
匹配只应用于每个
开始-结束
标记内


旁注:我在这里使用匹配组,因为我以后想在这种特殊情况下删除数字。但是,对于如何将n次匹配引入的问题,这并不重要。

您可以这样编写正则表达式

(START(?:(?:(?!START)[^:])*:){3,})\d+(:END)
只有当
正好包含在字符串中4次时,才会匹配

说明:

  • (START
    -启动捕获组并按字面意思匹配
    START
  • (?:(?:(?!START)[^:])*:{3,})
    -如果它看到literal
    START
    并后跟
    ,则匹配某些可选文本并拒绝匹配,其中
    {3,}
    表示三次或更多次
  • \d+
    -匹配一个或多个数字
  • (:END)
    -逐字匹配另一个
    END
    ,并在group2中捕获它

您可以这样编写正则表达式

(START(?:(?:(?!START)[^:])*:){3,})\d+(:END)
只有当
正好包含在字符串中4次时,才会匹配

说明:

  • (START
    -启动捕获组并按字面意思匹配
    START
  • (?:(?:(?!START)[^:])*:{3,})
    -如果它看到literal
    START
    并后跟
    ,则匹配某些可选文本并拒绝匹配,其中
    {3,}
    表示三次或更多次
  • \d+
    -匹配一个或多个数字
  • (:END)
    -逐字匹配另一个
    END
    ,并在group2中捕获它

您似乎在寻找
开始
,然后是4x
:[^:]*
,即
之后是一些非
字符,然后是
:结束
。您似乎在寻找
开始
,然后是4x
:[^:]*
,也就是说,
后面跟着一些非
字符,然后是
:END
。作为旁注:
(?:)
是一个非捕获组,与
不匹配,这可能会让人感到困惑context@Lino:OP已写入
(:END)
而不是
(?:END)
,因此该组不是非捕获组。另外,如果你注意到在他的regex101 URL中,他将其引用为
$2
,因此这不是OP的打字错误,而是打算在group2I中捕获我所说的
(?:[^:::*:)
,它以
开头(?:
所以它的行为类似于非捕获-group@Lino:这是故意的。我故意将该组设置为非捕获,方法是将
?:
,因为OP在其原始正则表达式中没有该组,我不想引入任何额外的组,因为OP已经有两个预期的组,他将在其解决方案中重新引用。谢谢e更多问题:我修改了示例以便它可以重复,并且{n}匹配应该只在每个
开始
结束
标记之间分别计算。作为旁注:
(?:)
是一个非捕获组,不会匹配
,在这一特定方面可能会令人困惑context@Lino:OP已写入
(:END)
不是
(?:END)
所以这不是一个非捕获组。另外,如果你注意到在他的regex101 URL中,他将其引用为
$2
,因此这不是OP的打字错误,而是打算在组2中捕获我所说的
(?:[^:::*:)
,它以
开头(?:
所以它的行为类似于非捕获-group@Lino:这是故意的。我故意将该组设置为非捕获,方法是将
?:
,因为OP在其原始正则表达式中没有该组,我不想引入任何额外的组,因为OP已经有两个预期的组,他将在其解决方案中重新引用。谢谢还有一个问题:我修改了示例以便它可以重复,并且{n}匹配应该只在每个
START
END
标记之间分别计数。