相关疑难解决方法(0)

我们如何匹配^ nb ^ n与Java正则表达式?

这是一系列教育正则表达式文章的第二部分.它显示了向前看符号和嵌套引用如何可以用来匹配非正规languge ñ b ñ.嵌套引用首先介绍在:这个正则表达式如何找到三角形数字?

其中一种原型非常规语言是:

L = { añ bñ: n > 0 }

这是所有非空字符串的语言,由一些数字a后跟相同数量的字符串组成b.在这个语言字符串的例子有ab,aabb,aaabbb.

这种语言可以通过泵浦引理显示为非规则的.它实际上是一种原型上下文无关语言,可以通过无上下文语法 生成S ? aSb | ab.

尽管如此,现代正则表达式实现清楚地认识到的不仅仅是常规语言.也就是说,它们不是形式语言理论定义的"规则".PCRE和Perl支持递归正则表达式,.NET支持平衡组定义.更少的"花哨"特征,例如反向引用匹配,意味着正则表达式不规则.

但这个"基本"功能有多强大?L例如,我们可以用Java正则表达式识别吗?我们也许可以结合lookarounds和嵌套引用,并具有与如工作模式String.matches来匹配字符串一样ab,aabb,aaabbb,等?

参考

相关问题

java regex lookaround capturing-group nested-reference

94
推荐指数
3
解决办法
1万
查看次数

什么是正则表达式平衡组?

我刚刚阅读了一个关于如何在双花括号中获取数据的问题(这个问题),然后有人提出了平衡组.我还不太确定它们是什么以及如何使用它们.

我读了平衡组定义,但解释很难理解,我仍然对我提到的问题感到困惑.

有人可以简单地解释什么是平衡组以及它们如何有用吗?

.net c# regex balancing-groups

88
推荐指数
2
解决办法
1万
查看次数

参考 - 这个正则表达式意味着什么?

这是什么?

这是常见问答的集合.这也是社区Wiki,因此每个人都被邀请参与维护.

为什么是这样?

患的是给我泽码型的问题和答案不佳,没有解释.此参考旨在提供质量问答的链接.

范围是什么?

此引用适用于以下语言:,,,,,,.

这可能过于宽泛,但这些语言共享相同的语法.对于特定功能,它背后的语言标签,例如:

  • 什么是正则表达式平衡组?

regex

52
推荐指数
1
解决办法
11万
查看次数

使用正则表达式(PCRE)匹配a ^ nb ^ nc ^ n(例如"aaabbbccc")

众所周知,现代正则表达式实现(最值得注意的是PCRE)与常规语法的原始概念几乎没有共同之处.例如,您可以解析无上下文语法的经典示例{a n b n ; n> 0}(例如aaabbb)使用此正则表达式(演示):

~^(a(?1)?b)$~
Run Code Online (Sandbox Code Playgroud)

我的问题是:你能走多远?是否也可以使用PCRE 解析上下文敏感的语法 {a n b n c n ; n> 0}(例如aaabbbccc)?

php regex pcre

42
推荐指数
4
解决办法
6232
查看次数

Perl的`(?PARNO)`在完成时会丢弃它自己的命名捕获吗?

递归正则表达式是否理解命名捕获?在文档中有一个注释(?{{ code }}),它是一个独立的子模式,它有自己的一组捕获,在子模式完成时被丢弃,并且有一个注释(?PARNO),它的"类似于(?{{ code }}).(?PARNO)在它完成时丢弃它自己的命名捕获?

我正在写关于Perl的Mastering Perl的递归正则表达式.perlre已经有一个平衡parens的例子(我在Perl正则表达式匹配平衡括号中显示它),所以我想我会尝试平衡引号:

#!/usr/bin/perl
# quotes-nested.pl

use v5.10;

$_ =<<'HERE';
He said 'Amelia said "I am a camel"'
HERE

say "Matched!" if m/
    (
        ['"]
            ( 
                (?: 
                    [^'"]+
                    | 
                    ( (?1) ) 
                )* 
            )
        ['"]
    )
    /xg;

print "
1 => $1
2 => $2
3 => $3
4 => $4
5 => $5
";
Run Code Online (Sandbox Code Playgroud)

这有效,两个引号显示在$1$3: …

regex perl named-captures

32
推荐指数
1
解决办法
773
查看次数

是否可以在不使用递归或平衡组的情况下将嵌套括号与正则表达式匹配?

StackOverflow鼓励自己回答问题,所以我决定创建这篇文章来分享我最近发现的东西.

问题:在正则表达式中匹配任意嵌套的括号组,例如Java的java.util.regex,既不支持递归也不支持平衡组.即,匹配3个外部组:

(第一第二第三)))))))

这个练习纯粹是学术性的,因为我们都知道正则表达式不应该被用来匹配这些东西,正如Q-tips不应该被用来清理耳朵一样.

java regex

20
推荐指数
2
解决办法
3090
查看次数

在可变长度的后视中平衡组

TL; DR:在.NET的lookbehinds中使用捕获(特别是平衡组)会改变获得的捕获,尽管它不应该有所作为.什么是.NET的外观打破了预期的行为?

我试图找到另一个问题的答案,作为借助.NET平衡组的借口.但是,我不能让他们在可变长度的lookbehind内工作.

首先,请注意我并不打算高效地使用这个特定的解决方案.这更多是出于学术原因,因为我觉得可变长度的lookbehind有一些我不知道的事情.并且知道这可能在将来派上用场,当我真的需要使用这样的东西来解决问题时.

考虑这个输入:

~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q
Run Code Online (Sandbox Code Playgroud)

我们的目标是匹配所有的字母,这是由前括号内~,没有多么深跌(所以一切从ai).我的尝试是检查后视镜中的正确位置,以便我可以通过一次调用获得所有字母Matches.这是我的模式:

(?<=~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*)[a-z]
Run Code Online (Sandbox Code Playgroud)

在lookbehind我尝试找到一个~(,然后我使用命名组堆栈Depth来计算无关的开括号.只要打开的括号~(永远不会关闭,那么lookbehind应该匹配.如果到达(?<-Depth>...)那个右括号,则无法从堆栈中弹出任何内容,并且lookbehind应该失败(即,对于所有来自的字母j).不幸的是,这不起作用.相反,我匹配a,b,c,e,f,gm.所以只有这些:

~(a b (c) _ (e f (g) _) _) _ (_ (_ (m) _) _) _
Run Code Online (Sandbox Code Playgroud)

这似乎意味着,一旦我关闭了一个单一的括号,看起来就无法匹配任何东西,除非我回到我以前最高的嵌套水平.

好吧,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组.但后来我尝试了这个没有外观.我为每个字母创建了一个字符串,如下所示:

~(z …
Run Code Online (Sandbox Code Playgroud)

.net regex lookaround balancing-groups

14
推荐指数
1
解决办法
799
查看次数

使用PCRE匹配n> 0的^ nb ^ nc ^ n

如何将n> 0的^ nb ^ nc ^ n与PCRE匹配?

以下情况应符合:

abc
aabbcc
aaabbbccc
Run Code Online (Sandbox Code Playgroud)

以下情况不符合:

abbc
aabbc
aabbbccc
Run Code Online (Sandbox Code Playgroud)

这是我"尝试过"的东西; /^(a(?1)?b)$/gmx但这匹配n> 0的^ nb ^ n:

ab
aabb
aaabbb
Run Code Online (Sandbox Code Playgroud)

Online demo

注意:这个问题是一样的这一个与语言的变化.

regex pcre

14
推荐指数
2
解决办法
2806
查看次数

捕捉量词和量词算术

首先,让我解释一下,这个问题既不是关于如何捕获组,也不是关于如何使用量词,这是我非常熟悉的正则表达式的两个特征.对于可能熟悉异国情调引擎中不寻常语法的正则表达式爱好者而言,这是一个更高级的问题.

捕捉量词

有谁知道正则表达式的味道是否允许你捕捉量词?通过这个,我的意思是计数与+和*等量词匹配的字符数将被计算,并且这个数字可以在另一个量词中再次使用.

例如,假设您要确保在此类字符串中具有相同数量的Ls和Rs:LLLRRRRR

你可以想象一下这样的语法

L(+)R{\q1}
Run Code Online (Sandbox Code Playgroud)

其中捕获了L的+量词,并且在R的量词中将捕获的数字称为{\ q1}

这对平衡{@,=, - ,/}在字符串中的数量很有用,例如@@@@"星球大战"===="1977"----"科幻小说"////"乔治卢卡斯"

与递归的关系

在某些情况下,量词捕获会优雅地替换递归,例如由相同数量的Ls和Rs构成的一段文本,a in

L(+) some_content R{\q1} 
Run Code Online (Sandbox Code Playgroud)

这个想法在下面的页面中有一些细节:Captifured Quantifiers

它还讨论了捕获量化的自然扩展:量化算术,适用于您希望匹配(3*x + 1)之前匹配的字符数的情况.

我试图找出这样的事情是否存在.

在此先感谢您的见解!

更新

Casimir给出了一个很棒的答案,它显示了两种方法来验证模式的各个部分具有相同的长度.但是,我不想在日常工作中依赖其中任何一种.这些都是表现出色表演的伎俩.在我看来,这些美丽但复杂的方法证实了这个问题的前提:一个正则表达式特征来捕获量化的字符数(例如+或*)能够匹配将使这种平衡模式非常简单并扩展语法一种令人愉快的表达方式.

更新2(稍后)

我发现.NET有一个接近我所询问的功能.添加了演示该功能的答案.

regex recursion quantifiers

9
推荐指数
1
解决办法
698
查看次数

表示为String的2D矩阵的正则表达式

我试图在表示为字符串的2D矩阵中搜索模式.请注意以下事项:

// horizontal line
String pat1 =
    "............." +
    "............." +
    "............." +
    "....XXXX....." +
    "............." +
    ".............";

// vertical line
String pat2 =
    "............." +
    "......X......" +
    "......X......" +
    "......X......" +
    "......X......" +
    ".............";
Run Code Online (Sandbox Code Playgroud)

搜索第一个模式将是微不足道的,正则表达式将是这样的:

X+
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,它有点棘手但可行,因为我知道矩阵的列数和行数:

(X.{`WIDTH - 1`})+
Run Code Online (Sandbox Code Playgroud)

当我遇到问题想出正确的正则表达式时,我试图找出一种方法来识别以下模式:

// fixed but unknown number of columns
String pat3 =
    "............." +
    ".....XXX....." +
    ".....XXX....." +
    ".....XXX....." +
    ".....XXX....." +
    ".............";

// variable number of columns
String pat4 =
    "............." +
    ".....XXX....." +
    "....XXXXX...." +
    "...XXXXXXX..." +
    ".....XXX....." …
Run Code Online (Sandbox Code Playgroud)

java regex matrix

7
推荐指数
1
解决办法
464
查看次数