相关疑难解决方法(0)

.NET正则表达式中"组"和"捕获"之间有什么区别?

当谈到.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'的捕获?

.net c# regex

155
推荐指数
5
解决办法
3万
查看次数

这个正则表达式如何找到三角形数字?

这是一系列教育正则表达式文章的一部分,这是对嵌套引用概念的温和介绍.

前几个三角形数字是:

 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)

有很多方法可以检查数字是否为三角形.有一种有趣的技术使用正则表达式如下:

  • 给定n,我们首先创建一个长度为n的字符串,其中填充相同的字符
  • 然后我们将此字符串与模式匹配 ^(\1.|^.)+$
    • 当且仅当此模式与字符串匹配时,n为三角形

以下是一些片段,表明它适用于多种语言:

PHP(在ideone.com上)

$r = '/^(\1.|^.)+$/';

foreach (range(0,50) as $n) {
  if (preg_match($r, str_repeat('o', $n))) {
     print("$n ");
  }
}
Run Code Online (Sandbox Code Playgroud)

Java(在ideone.com上)

for (int n = 0; n <= 50; …
Run Code Online (Sandbox Code Playgroud)

c# java regex capturing-group nested-reference

42
推荐指数
1
解决办法
2253
查看次数

正则表达式:重复捕获组

我必须从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也会发出以下警告:

您重复了捕获组本身.该组将仅捕获最后一次迭代.在重复组周围放置捕获组以捕获所有迭代.

我已经咨询了他们的帮助文件,但我不知道如何解决这个问题.

如何单独捕获每列?

.net c# regex

12
推荐指数
3
解决办法
2万
查看次数

可重复的,复杂的正则表达式,带点"." 分隔符

我有一个正则表达式.它包含必需的命名捕获组和一些可选的命名捕获组.它捕获单个匹配并将这些部分解析为我需要的命名组.

除此之外,现在我需要重复一遍.

本质上,我的正则表达式表示(可能)更长的字符串中的单个原子单元.而不是完全匹配我的正则表达式,目标字符串通常包含正则表达式的重复实例,由点''分隔.字符.

例如,如果这是我的正则表达式捕获的内容: <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步骤,并重新使用正则表达式作为验证机制.

编辑:

作为齿轮中的另一个扳手,我想不允许任何点'.' 从字符串的开头或结尾开始的字符.它们应仅作为路径段之间的分隔符存在.

c# regex

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

.NET Capture,Group,Match之间的差异

我正在使用.NET Regex类型进行小型应用程序.而"捕捉,分组和匹配"类型让我很困惑.我从未见过如此丑陋的解决方案.有人可以解释一下他们的用法吗?非常感谢.

regex

6
推荐指数
1
解决办法
907
查看次数

我的正则表达式做错了什么?

我试图捕获"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)(已回答)为什么我需要使用".*"?我认为它会在()之间收集任何东西?

html javascript regex capturing-group

0
推荐指数
2
解决办法
185
查看次数

标签 统计

regex ×6

c# ×4

.net ×2

capturing-group ×2

html ×1

java ×1

javascript ×1

nested-reference ×1