标签: capturing-group

JavaScript regex返回引用从单个捕获组返回一系列匹配(多个组)

我非常肯定在花了一夜之后试图找到一个不可能的答案,我已经开发了一个解决方案 - 但是,如果有人知道更好的方法,我很乐意听到它...

我在代码上经历了很多次迭代,以下只是一个思路.我相信,在某些时候,我正在使用全局标志,以便match()工作,我不记得现在是否有必要.

var str = "@abc@def@ghi&jkl";
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/;
Run Code Online (Sandbox Code Playgroud)

这里的想法,在此简化的代码,是可选的组1,其中有一个未指定的量,将匹配@abc,@def和@ghi.它只会捕获将有一个或多个字母字符.第2组是相同的,除了&符号上的匹配.它也应该锚定到字符串的开头和结尾.

我希望能够引用两个组的所有匹配,即:

result = str.match(regex);
alert(result[1]); //abc,def,ghi
alert(result[1][0]); //abc
alert(result[1][1]); //def
alert(result[1][2]); //ghi
alert(result[2]); //jkl
Run Code Online (Sandbox Code Playgroud)

我的伙伴说这在.net中对他来说很好用,不幸的是我根本无法让它工作 - 只有在后面引用中返回任何组的最后匹配,如下所示:

(此外,任意一组可选都会造成混乱,设置全局标志也是如此)

var str = "@abc@def@ghi&jkl";
var regex = /(?:@([a-z]+))(?:&([a-z]+))/;

var result = str.match(regex);

alert(result[1]); //ghi
alert(result[1][0]); //g
alert(result[2]); //jkl
Run Code Online (Sandbox Code Playgroud)

以下是我到达的解决方案,捕获有问题的整个部分,并自己创建阵列:

var str = "@abc@def@ghi&jkl";
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/;

var result = regex.exec(str);

alert(result[1]); //@abc@def@ghi
alert(result[2]); //jkl

var result1 = result[1].toString();
result[1] = result1.split('@')

alert(result[1][1]); //abc
alert(result[1][2]); //def
alert(result[1][3]); //ghi
alert(result[2]); …
Run Code Online (Sandbox Code Playgroud)

javascript regex arrays regex-group capturing-group

5
推荐指数
1
解决办法
3225
查看次数

如何在Notepad ++ regexp中使用九个以上的反向引用?

如果我在Notepad ++中使用长正则表达式,即:

^([^ ]+) ([^ ]+) ([^ ]+) (\[.*?\]) (".*?") (".*?") (".*?") (".*?") (\d+) (\d+) (\d+)$
Run Code Online (Sandbox Code Playgroud)

(这是用于将Apache日志行从空格分隔转换为制表符分隔)

然后我无法成功使用超过9个反向引用来替换,因为\10产生了第一个捕获组的内容加上文字"0".

我尝试过$10,但这给出了相同的结果.

regex backreference notepad++ capturing-group

5
推荐指数
1
解决办法
317
查看次数

使用相同的组捕获<thisPartOnly>和(thisPartOnly)

假设我们有以下输入:

<amy>
(bob)
<carol)
(dean>
Run Code Online (Sandbox Code Playgroud)

我们还有以下正则表达式:

<(\w+)>|\((\w+)\)
Run Code Online (Sandbox Code Playgroud)

现在我们得到两场比赛(如rubular.com上所示):

  • <amy>是匹配,\1捕获amy,\2失败
  • (bob)是匹配,\2捕获bob,\1失败

这个正则表达式完成了我们想要的大部分内容,它们是:

  • 它恰当地匹配打开和关闭括号(即没有混合)
  • 它捕获了我们感兴趣的部分

但是,它确实有一些缺点:

  • 重复捕获模式(即"主要"部分)
    • 这只是\w+在这种情况下,但一般来说这可能非常复杂,
      • 如果涉及反向引用,则必须为每个备用重新编号!
      • 重复使维护成为一场噩梦!(如果它改变了怎么办?)
  • 这些组基本上是重复的
    • 根据哪些备用匹配,我们必须查询不同的组
      • 它只是\1\2在这种情况下,但通常"主要"部分可以拥有自己的捕获组!
    • 这不仅不方便,而且可能存在不可行的情况(例如,当我们使用仅限于查询一个组的自定义正则表达式框架时)
  • 如果我们也想要匹配等{...},情况会迅速恶化[...].

所以问题很明显:如何在不重复"主要"模式的情况下做到这一点?

注意:在很大程度上我对java.util.regex口味感兴趣,但欢迎其他口味.


附录

这部分没有什么新内容; 它只用一个例子说明了上面提到的问题.

让我们将上面的例子带到下一步:我们现在想要匹配这些:

<amy=amy>
(bob=bob)
[carol=carol]
Run Code Online (Sandbox Code Playgroud)

但不是这些:

<amy=amy)   # non-matching bracket
<amy=bob>   # left hand side not equal to right hand side
Run Code Online (Sandbox Code Playgroud)

使用替代技术,我们有以下工作(如rubular.com上所示): …

java regex capturing-group

4
推荐指数
1
解决办法
355
查看次数

C#中的迭代正则表达式捕获

我必须读入包含许多坐标的文件.该文件的结构如下:

X1/Y1,X2/Y2,X3/Y3,X4/Y4
Run Code Online (Sandbox Code Playgroud)

其中X和Y是正整数.为了解决这个问题,我想使用正则表达式(我认为这通常是一个好主意,因为模式更改时的重构最少).

因此我开发了以下正则表达式:

Regex r = new Regex(@^(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+))(,(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+)))*$");
Run Code Online (Sandbox Code Playgroud)

但是当我在数据上测试这个正则表达式时,例如:

1302/1425,1917/2010
Run Code Online (Sandbox Code Playgroud)

正则表达式似乎只记得最后一个X,Y和Coor组.在这种情况下,Coor是"12/17",X是"1917",Y是"2010".有没有办法生成某种树.所以我找到了一个给我所有Coor表达式的对象,每个Coor下有一个X和Y组件?

如果可能的话,我只想使用一个正则表达式,这是因为格式可能会改为另一个.

c# regex recursion capturing-group

4
推荐指数
1
解决办法
1869
查看次数

得到组与星号的匹配?

如何获取带星号的群组的内容?

例如,我想删除一个逗号分隔的列表,例如1,2,3,4,5

private static final String LIST_REGEX = "^(\\d+)(,\\d+)*$";
private static final Pattern LIST_PATTERN = Pattern.compile(LIST_REGEX);

public static void main(String[] args) {
    final String list = "1,2,3,4,5";
    final Matcher matcher = LIST_PATTERN.matcher(list);
    System.out.println(matcher.matches());
    for (int i = 0, n = matcher.groupCount(); i < n; i++) {
        System.out.println(i + "\t" + matcher.group(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

true
0   1,2,3,4,5
1   1
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得每一个条目,即,,,,1... ?23

我正在寻找一个共同的解决方案。这只是一个说明性示例。
请想象一个更复杂的正则表达式,^\\[(\\d+)(,\\d+)*\\]$例如匹配列表[1,2,3,4,5]

java regex string capturing-group

4
推荐指数
1
解决办法
2166
查看次数

匹配数字中的增量数字

谷歌搜索了很多天关于这个问题,最后我在这里发布这个问题,并希望专家在这里解决; 我正在寻找可以匹配增量反向引用的正则表达式模式.让我解释:

对于数字9422512322,模式(\d)\1将匹配22两次,我想要匹配的模式(类似(\d)\1+1)12(second digit等于first digit + 1)

总之模式应该匹配像所有的发生12,23,34,45,56,等等......有没有更换,只是需要相匹配.

regex backreference capturing-group

4
推荐指数
1
解决办法
326
查看次数

使用正则表达式提取URL参数 - 重复捕获组

我正在尝试通过正则表达式提取URL参数,并且非常接近让它工作.我甚至不知道问题是什么:我的正则表达式在重复的捕获组中磕磕绊绊.但我根本无法弄清楚如何解决它.

语言是PHP.

我的网址类似于下面的网址.它可以没有参数,只有一个或多个:

member.php?action=bla&arg=2&test=15&schedule=16
Run Code Online (Sandbox Code Playgroud)

我的正则表达式如下:

member\.php((?:[\?|&](\w*)=(\w*))*)
Run Code Online (Sandbox Code Playgroud)

我的捕获组最终成为:

1. action=bla&arg=2&test=15&schedule=16
2. schedule
3. 16
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何单独捕获所有参数.我是否只需要为第一个捕获组定居并自己爆炸?如果我可以在一个正则表达式中完成所有工作,那么对于我的目的来说会更优雅.

php regex parameters url capturing-group

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

是否可以在正则表达式中替换捕获的组?

是否可以使用正则表达式重复捕获的组一定次数,并且在捕获组中也可以找到重复的数量?

例:

Regex: /(a)([0-9])/g
String: ba1na3na2
Expected result: banaaanaa
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这样做的东西,但也许我一直在寻找错误的地方.注意:我使用的是Perl - 但我也有兴趣看到其他风味的答案.

regex perl substitution capturing-group

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

php preg_replace 为每个捕获组分配不同的替换模式

我正在尝试以布尔模式执行 mysql 全文搜索,并且需要在构建 mysql 查询之前准备搜索文本。

为了实现这一目标,我认为我可以使用 PHP 函数preg_replace并用一种特定模式替换每个捕获组。

  1. 第一个模式必须找到引号 ( "hello world") 之间的单词或句子并在前面添加+( +"hello world")。
  2. 第二个模式必须找到其余单词(不带引号)并添加+前后*( +how*)。

正则表达式模式

["']+([^"']+)["']+|([^\s"']+)
Run Code Online (Sandbox Code Playgroud)

替代模式

+"\1" +\2*
Run Code Online (Sandbox Code Playgroud)

例子

对于以下输入:

"hello world" how are you?
Run Code Online (Sandbox Code Playgroud)

它应该返回:

+"hello world" +how* +are* +you?*
Run Code Online (Sandbox Code Playgroud)

但相反,它返回一些“错误”的东西

+"hello world" +* +"" +how* +"" +are* +"" +you?*
Run Code Online (Sandbox Code Playgroud)

我知道替换模式+"\1" +\2*永远不会起作用,因为我没有告诉任何地方+"..."应该只适用于第一个捕获组和+...*第二个捕获组。

测试在线正则表达式

PHP代码

$query = preg_replace('~["\']+([^"\']+)["\']+|([^\s"\']+)~', '+"\1" +\2*', $query);
Run Code Online (Sandbox Code Playgroud)

有没有办法在 PHP 中实现这一点?先感谢您。


编辑/解决方案

感谢 …

php regex sql-injection preg-replace capturing-group

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

为什么行终止符`\r\n` 导致组不匹配?

我正在\r\n使用 Perl v5.30 在 Linux上处理带有 Windows 行终止符 ( ) 的文本文件。

我不明白的是,为什么使用这些文本文件,捕获组与字符不匹配,而正则表达式匹配。

例子:

$ echo $'Line1\r\nLine2\n' | perl -ne 'print /(.*)/'
Line2

$ echo $'Line1\r\nLine2\n' | perl -ne '/(.*)/ && print "match\n"'
match
match
match
Run Code Online (Sandbox Code Playgroud)

第一行没有任何内容被捕获,但所有(三)行都匹配。

为什么会这样?

perl line-endings capturing-group

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