-2

我想在 Perl Regex 的非捕获组中使用负前瞻。到目前为止,我已经创建了一个不允许 3 个“字符对”进入字符串的表达式

CASE 1: ^(?!(?:\w*(.)\1){3}).+$

For example the string: Mytte!3sttStrring  | Not pass - 3 pairs | "tt","tt","rr"

如果您看到该组之前有一个否定的前瞻,我想将此表达式添加到一个组中。为了理解这一点,我将向您展示另一个仅不允许一对或字符的示例。

CASE 2 : no match if there is a pair in string:   (?=^(?:(.)(?!\1))*$)

如果您在https://regex101.com/中测试这 2 个表达式,您将看到CASE 2上的字符串“MySampleString”我有 2 个匹配信息。(全场比赛和第 1 组比赛)。现在,如果您运行第一个模式(CASE 1),您将在匹配信息中仅看到完全匹配。

在我尝试在 CASE 1 中添加分组匹配选项时,将括号括起来:

CASE 1 my try:   (^(?!(?:\w*(.)\1){3}).+$)

但现在里面的表达式不起作用:/

我想找到一种 ^(?!(?:\w*(.)\1){3}).+$ 可以工作的方法(使用完全匹配和 Group1 匹配)。我必须将此选项添加到我正在处理的很长的正则表达式中,它不能作为一个完整的匹配组工作。为了使其更简洁,我将向您展示一个示例,即字符串不能有“一对字符”,同时不能包含任何字母的 4 次重复。

        (?=^(?:(.)(?!\1))*$)(?=^(?:(.)(?!(?:.*?\1){4}))*$)

这两个表达式 (?=^(?:(.)(?!\1)) $) 和 (?=^(?:(.)(?!(?:. ?\1){4}))* $) 合并,因为两者都有分组匹配。

4

1 回答 1

0

如果你的意思是“组合”是 AND

^(?!(\S)\1)(?!(\S)(?:\S*?\2){4})\S+ 

如果你的意思是“组合”是 OR

^(?!(\S)\1|(\S)(?:\S*?\2){4})\S+ 
于 2019-04-20T02:16:01.237 回答