问题标签 [nested-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 这个正则表达式如何找到三角数?
作为一系列教育正则表达式文章的一部分,这是对嵌套引用概念的温和介绍。
前几个三角数是:
有很多方法可以检查一个数字是否是三角形的。有一种使用正则表达式的有趣技术,如下所示:
- 给定n,我们首先创建一个长度为n并填充相同字符的字符串
- 然后我们将这个字符串与模式匹配
^(\1.|^.)+$
- n是三角形当且仅当此模式与字符串匹配
以下是一些片段,表明这适用于多种语言:
PHP(在 ideone.com 上)
Java(在 ideone.com 上)
C#(在 ideone.com 上)
所以这个正则表达式似乎有效,但有人可以解释一下吗?
类似问题
regex - 我们如何匹配 a^nb^n?
这是一系列教育正则表达式文章的第二部分。它显示了如何使用前瞻和嵌套引用来匹配非常规语言 a n b n。嵌套引用首先在:这个正则表达式如何找到三角数?
一种原型非正则语言是:
L = { a
nb
n: n > 0 }
这是所有非空字符串的语言,由一定数量的a
' 后跟相等数量的b
' 组成。这种语言中的字符串示例有ab
, aabb
, aaabbb
.
泵引理可以证明这种语言是非常规的。它实际上是一种原型上下文无关语言,可以通过上下文无关文法 S → aSb | ab
生成。
尽管如此,现代正则表达式实现清楚地识别的不仅仅是常规语言。也就是说,它们不是形式语言理论定义的“常规”。PCRE 和 Perl 支持递归正则表达式,.NET 支持平衡组定义。更不“花哨”的功能,例如反向引用匹配,意味着正则表达式不是正则表达式。
但是这个“基本”功能到底有多强大?例如,我们可以L
用 Java 正则表达式识别吗?我们是否可以将环视和嵌套引用结合起来,并使用一种模式String.matches
来匹配诸如ab
, aabb
,aaabbb
等之类的字符串?
参考
- perlfaq6:我可以使用 Perl 正则表达式来匹配平衡文本吗?
- MSDN - 正则表达式语言元素 - 平衡组定义
- pcre.org - PCRE 手册页
- regular-expressions.info - Lookarounds和Grouping and Backreferences
java.util.regex.Pattern
相关问题
java - 这个 Java 正则表达式如何检测回文?
这是一系列教育正则表达式文章的第三部分。它遵循这个正则表达式如何找到三角数?(首先介绍了嵌套引用)以及我们如何将 a^nb^n 与 Java 正则表达式匹配? (其中进一步阐述了前瞻“计数”机制)。这部分介绍了一种特定形式的嵌套断言,当它与嵌套引用结合使用时,Java 正则表达式可以匹配大多数人认为“不可能”的东西:回文!
回文的语言是非常规的;它实际上是无上下文的(对于给定的字母表)。也就是说,现代正则表达式实现不仅仅识别常规语言,Perl/PCRE 的递归模式和 .NET 的平衡组可以轻松识别回文(请参阅:相关问题)。
但是,Java 的正则表达式引擎不支持这些“高级”功能。然而,“某人” (*wink*)设法编写了以下正则表达式,似乎可以很好地完成这项工作(另见 ideone.com):
所以这似乎有效,但如何?
参考
常识警报!!!
这不是检测回文的最佳方法;
O(N^3)
充其量是。用更通用的编程语言执行这种检测既更有效也更直接。您不想使用正则表达式来检测回文,原因与您不想使用正则表达式查找素数的原因相同。也就是说,您将研究非递归非平衡组正则表达式如何检测回文,原因与您研究正则表达式如何用于素数测试的原因相同:这很有趣,很有挑战性,很有教育意义。
相关问题
- 如何使用正则表达式检查字符串是否为回文?- 不可能”!(除非...)
- 如何检查给定的字符串是否是回文?- 多种语言的非正则表达式解决方案
- 如何确定一个数字是否是正则表达式的素数?
c# - 这个正则表达式替换如何反转字符串?
这是一系列教育正则表达式文章的第四部分。它展示了嵌套引用的组合(参见:这个正则表达式如何找到三角数?)到断言中的“计数”(参见:我们如何将 a^nb^n 与 Java 正则表达式匹配?)可用于反转字符串. 以编程方式生成的模式使用元模式抽象(请参阅:此 Java 正则表达式如何检测回文?)。在该系列中,这些技术首次用于替换而不是整个字符串匹配。
提供了完整的工作 Java 和 C# 实现。包括励志名言。
使用正则表达式反转字符串似乎从来都不是一个好主意,如果它完全可能的话,甚至不是立即显而易见的,如果是的话,人们可能会如何尝试这样做。
虽然这仍然不是一个好主意,但至少现在我们知道这是可能的,因为这是一种方法:
C# (也在 ideone.com 上)
Java (也在 ideone.com 上)
C# 和 Java 版本似乎都使用相同的整体算法,仅在抽象的实现细节上略有不同。
显然,这不是反转字符串的最佳、最直接、最有效的方法。也就是说,为了了解正则表达式;如何概念化模式;引擎如何工作以匹配它们;如何将各个部分组合在一起以构建我们想要的东西;如何以可读和可维护的方式这样做;只是为了学习新事物的纯粹乐趣,我们能解释一下它是如何工作的吗?
附录:备忘单!
这是对使用的基本正则表达式结构的简要描述:
(?sx)
是嵌入的标志修饰符。s
启用“单行”模式,允许点匹配任何字符(包括换行符)。x
启用自由间距模式,其中未转义的空格被忽略(#
并可用于注释)。^
并且$
是行首和行尾的锚点。?
作为重复说明符表示可选(即零或一)。例如,作为重复量词,.*?
它表示*
(即零次或多次)重复是不情愿的/非贪婪的。(…)
用于分组。(?:…)
是非捕获组。一个捕获组保存它匹配的字符串;它允许后退/前进/嵌套引用(例如\1
)、替换替换(例如$2
)等。(?=…)
是积极的前瞻;它看起来向右断言给定模式的匹配。(?<=…)
是积极的回顾;它看起来向左。
语言参考/其他资源
java - 为什么 Java 正则表达式引擎在 + 重复时抛出 StringIndexOutOfBoundsException?
我编写了一个正则表达式模式来查找斐波那契数(不管为什么,我只是这样做了)。它按预期工作得非常好(参见 ideone.com):
所有格重复(即在++
主“循环”上)是至关重要的,因为您不希望使用这种匹配算法进行回溯。但是,使重复可回溯(即仅+
在主“循环”上)不会导致不匹配,而是运行时异常!!!(如 ideone.com 上所见):
有人可以解释这里发生了什么吗?这是 Java 正则表达式引擎中的错误吗?
php - 这种 PCRE 模式如何检测回文?
这个问题是关于在 PCRE 模式中使用前瞻、嵌套引用和条件来匹配所有回文的教育演示,包括那些不能被 PCRE 手册页中给出的递归模式匹配的回文。
在 PHP 片段中检查这个 PCRE 模式:
这种模式似乎可以检测回文,如本测试用例所示(另见 ideone.com):
那么这种模式是如何工作的呢?
笔记
此模式使用嵌套引用,这与此 Java 正则表达式如何检测回文?,但与 Java 模式不同的是,它没有后视(但它确实使用了条件)。
另外,请注意 PCRE手册页提供了一个递归模式来匹配一些回文:
手册页警告说这种递归模式不能检测所有回文(参见:Why will this recursive regex only match when a character repeats 2 n - 1 times? and also on ideone.com),但嵌套的参考/正向前瞻模式呈现在这个问题上可以。
regex - 正则练习:阶乘
这是 StackOverlow 的一个实验性新功能:通过解决各种经典问题来锻炼你的正则表达式肌肉。没有一个正确的答案,事实上我们应该收集尽可能多的正确答案,只要它们具有教育价值。接受所有口味,但请清楚记录。尽可能提供测试用例/片段来证明该模式“有效”。
我们如何使用正则表达式找到数字x是否是阶乘?
奖励:如果模式可以确定x = n!, 它也能找到n吗?
perl - Perl 嵌套结构:递归函数
作为我之前的帖子的后续行动!
我用嵌套的哈希引用测试了算法:
算法:
在某些情况下,缩进和换行符不会按预期显示:
示例 1:
输出:
相反,我更喜欢这样的输出:
或者
示例 2:
输出:
关于如何在没有额外换行符的情况下实现上述场景或正确缩进的任何指导?
感谢任何帮助。
谢谢