当谈到.NET的正则表达式语言时,我对"组"和"捕获"之间的区别有点模糊.考虑以下C#代码:
MatchCollection matches = Regex.Matches("{Q}", @"^\{([A-Z])\}$");
Run Code Online (Sandbox Code Playgroud)
我希望这会导致单个捕获字母'Q',但如果我打印返回的属性MatchCollection,我看到:
matches.Count: 1
matches[0].Value: {Q}
matches[0].Captures.Count: 1
matches[0].Captures[0].Value: {Q}
matches[0].Groups.Count: 2
matches[0].Groups[0].Value: {Q}
matches[0].Groups[0].Captures.Count: 1
matches[0].Groups[0].Captures[0].Value: {Q}
matches[0].Groups[1].Value: Q
matches[0].Groups[1].Captures.Count: 1
matches[0].Groups[1].Captures[0].Value: Q
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?我知道整个比赛也有一个捕获,但这些小组是如何进入的?为什么不matches[0].Captures包括字母'Q'的捕获?
这是一系列教育正则表达式文章的一部分,这是对嵌套引用概念的温和介绍.
前几个三角形数字是:
1 = 1
3 = 1 + 2
6 = 1 + 2 + 3
10 = 1 + 2 + 3 + 4
15 = 1 + 2 + 3 + 4 + 5
Run Code Online (Sandbox Code Playgroud)
有很多方法可以检查数字是否为三角形.有一种有趣的技术使用正则表达式如下:
^(\1.|^.)+$
以下是一些片段,表明它适用于多种语言:
$r = '/^(\1.|^.)+$/';
foreach (range(0,50) as $n) {
if (preg_match($r, str_repeat('o', $n))) {
print("$n ");
}
}
Run Code Online (Sandbox Code Playgroud)
for (int n = 0; n <= 50; …Run Code Online (Sandbox Code Playgroud) 我必须从ASCII文本文件中解析一些表.这是一个部分样本:
QSMDRYCELL 11.00 11.10 11.00 11.00 -.90 11 11000 1.212
RECKITTBEN 192.50 209.00 192.50 201.80 5.21 34 2850 5.707
RUPALIINS 150.00 159.00 150.00 156.25 6.29 4 80 .125
SALAMCRST 164.00 164.75 163.00 163.25 -.45 80 8250 13.505
SINGERBD 779.75 779.75 770.00 773.00 -.89 8 95 .735
SONARBAINS 68.00 69.00 67.50 68.00 .74 11 3050 2.077
Run Code Online (Sandbox Code Playgroud)
该表由1列文本和8列浮点数组成.我想通过正则表达式捕获每一列.
我对正则表达式很新.这是我提出的错误的正则表达式模式:
(\S+)\s+(\s+[\d\.\-]+){8}
Run Code Online (Sandbox Code Playgroud)
但该模式仅捕获第一列和最后一列.RegexBuddy也会发出以下警告:
您重复了捕获组本身.该组将仅捕获最后一次迭代.在重复组周围放置捕获组以捕获所有迭代.
我已经咨询了他们的帮助文件,但我不知道如何解决这个问题.
如何单独捕获每列?
我有一个正则表达式.它包含必需的命名捕获组和一些可选的命名捕获组.它捕获单个匹配并将这些部分解析为我需要的命名组.
除此之外,现在我需要重复一遍.
本质上,我的正则表达式表示(可能)更长的字符串中的单个原子单元.而不是完全匹配我的正则表达式,目标字符串通常包含正则表达式的重复实例,由点''分隔.字符.
例如,如果这是我的正则表达式捕获的内容: <some match>
实际的字符串可能看起来像这些:
<some match><some match>.<some other match><some match>.<some other match>.<yet another match>修改原始正则表达式,考虑重复模式,忽略点的最简单方法是什么?
我不确定它是否真的需要,但这里是我正用于捕获单个段的正则表达式.同样,我想增强此功能以考虑可选的其他细分.我想让每个段在结果集中显示为另一个"匹配";
^(?<member>[A-Za-z_][A-Za-z0-9_]*)(?:\[(?<index>[0-9]+)\])?(?:\[(?<index2>[0-9]+)\])?(?:\[(?<index3>[0-9]+)\])?$
Run Code Online (Sandbox Code Playgroud)
它旨在解析类路径,最多包含三个可选的索引访问器.(即" member.sub_member[0].sub_sub_member[0][1][2]")
我怀疑答案涉及前瞻或后视,对此我并不完全熟悉.
我目前使用String.Split来分隔字符串段.但我认为如果正则表达式的增强足够简单,我跳过额外的Split步骤,并重新使用正则表达式作为验证机制.
编辑:
作为齿轮中的另一个扳手,我想不允许任何点'.' 从字符串的开头或结尾开始的字符.它们应仅作为路径段之间的分隔符存在.
我正在使用.NET Regex类型进行小型应用程序.而"捕捉,分组和匹配"类型让我很困惑.我从未见过如此丑陋的解决方案.有人可以解释一下他们的用法吗?非常感谢.
我试图捕获"Rio Grande Do Leste":
...
<h1>Rio Grande Do Leste<br />
...
Run Code Online (Sandbox Code Playgroud)
运用
var myregexp = /<h1>()<br/;
var nomeAldeiaDoAtaque = myregexp.exec(document);
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
更新:
还有2个问题:
1)搜索(文档)没有产生任何结果,但将其更改为(document.body.innerHTML)工作.这是为什么?
2)我不得不将其更改为:myregexp.exec(document.body.innerHTML)[1] ; 得到我想要的东西,否则它会给我一些结果,包括<h1>.这是为什么?
3)(已回答)为什么我需要使用".*"?我认为它会在()之间收集任何东西?