如何检查在Regexp(ruby)中声明了多少变量(掩码)?
假设我有一个带有任意数量捕获组的regexp:如何检查在Regexp(ruby)中声明了多少变量(掩码)?,ruby,regex,Ruby,Regex,假设我有一个带有任意数量捕获组的regexp: pattern = /(some)| ..a lot of masks combined.... |(other)/ 有没有办法确定这些组的数量?如果您总能找到一个与给定正则表达式匹配的字符串,那么它就足以与正则表达式匹配,并且。但是,确定regexp是否有与其匹配的字符串是np难[1]。这只有在你事先知道你将得到什么样的正则表达式时才可行 班上第二好的方法是or。但是,如果我们这样做,我们需要解析正则表达式 我不能展望未来,但是从Ruby 2.
pattern = /(some)| ..a lot of masks combined.... |(other)/
有没有办法确定这些组的数量?如果您总能找到一个与给定正则表达式匹配的字符串,那么它就足以与正则表达式匹配,并且。但是,确定regexp是否有与其匹配的字符串是np难[1]。这只有在你事先知道你将得到什么样的正则表达式时才可行 班上第二好的方法是or。但是,如果我们这样做,我们需要解析正则表达式 我不能展望未来,但是从Ruby 2.0开始,
Regexp
核心类中没有更好的方法
左括号表示文字左括号,前提是前面有一个未转换的反斜杠。反斜杠是不可缩放的,除非前面有未缩放的反斜杠。因此,一个字符前有奇数个反斜杠进行转义
未转义的左括号表示未后跟问号的捕获组iff。带有问号,它可以表示多种含义:(?'name')
和(?)
表示命名的捕获组。但是,命名和未命名捕获组不能在同一个正则表达式中共存[2]<代码>(?:)表示非捕获组。这是(?标志:)
的特例<代码>(?>)表示原子群<代码>(?=),(?!)
,(?(?)
表示注释
Ruby regexp引擎支持正则表达式中的注释。在主正则表达式中考虑它们将非常困难。如果我们真的想支持它们,我们可以尝试剥离它们,但完全支持它们将变得混乱,因为内联标志可能会变为扩展模式(从而导致行注释)以正则表达式无法捕获的方式打开和关闭。我将继续,不支持正则表达式注释中的未转义括号
我们要计算:
- 左括号的数目
\(
- 没有被反斜杠
转义的(?(读取:前面没有奇数个反斜杠,前面没有另一个反斜杠)和
- 后面没有问号(?!\?)
(?!(?:\\\\)*(?!\\)
。第二个断言将成为查找:(?)
整个解决方案
def count_groups(regexp)
# named capture support:
# named_count = regexp.named_captures.count
# return named_count if named_count > 0
# main:
test = /(?!<\?)\((?!(?:\\\\)*(?!\\))/
regexp.source.scan(test).count
end
def count_组(regexp)
#命名捕获支持:
#named_count=regexp.named_.count
#如果命名计数>0,则返回命名计数
#主要内容:
测试=/(?!我不太清楚你的意思。你能用一些示例输入和你想要得到的输出类型来说明吗?你的意思是,如何确定一个正则表达式有多少个捕获组?如果你使用命名捕获,那将是一个很好的选择。嗯…这是一个很好的选择!但在我的情况下,它可能很难被保持,因为我要组合任意的n图案的数量和名称可能会有冲突。你到底需要它干什么?我感觉到了一种冲突。