我非常肯定在花了一夜之后试图找到一个不可能的答案,我已经开发了一个解决方案 - 但是,如果有人知道更好的方法,我很乐意听到它...
我在代码上经历了很多次迭代,以下只是一个思路.我相信,在某些时候,我正在使用全局标志,以便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) 如果我在Notepad ++中使用长正则表达式,即:
^([^ ]+) ([^ ]+) ([^ ]+) (\[.*?\]) (".*?") (".*?") (".*?") (".*?") (\d+) (\d+) (\d+)$
Run Code Online (Sandbox Code Playgroud)
(这是用于将Apache日志行从空格分隔转换为制表符分隔)
然后我无法成功使用超过9个反向引用来替换,因为\10产生了第一个捕获组的内容加上文字"0".
我尝试过$10,但这给出了相同的结果.
假设我们有以下输入:
<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上所示): …
我必须读入包含许多坐标的文件.该文件的结构如下:
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组件?
如果可能的话,我只想使用一个正则表达式,这是因为格式可能会改为另一个.
如何获取带星号的群组的内容?
例如,我想删除一个逗号分隔的列表,例如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]
谷歌搜索了很多天关于这个问题,最后我在这里发布这个问题,并希望专家在这里解决; 我正在寻找可以匹配增量反向引用的正则表达式模式.让我解释:
对于数字9422512322,模式(\d)\1将匹配22两次,我想要匹配的模式(类似(\d)\1+1)12(second digit等于first digit + 1)
总之模式应该匹配像所有的发生12,23,34,45,56,等等......有没有更换,只是需要相匹配.
我正在尝试通过正则表达式提取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)
我无法弄清楚如何单独捕获所有参数.我是否只需要为第一个捕获组定居并自己爆炸?如果我可以在一个正则表达式中完成所有工作,那么对于我的目的来说会更优雅.
是否可以使用正则表达式重复捕获的组一定次数,并且在捕获组中也可以找到重复的数量?
例:
Regex: /(a)([0-9])/g
String: ba1na3na2
Expected result: banaaanaa
Run Code Online (Sandbox Code Playgroud)
我从来没有见过这样做的东西,但也许我一直在寻找错误的地方.注意:我使用的是Perl - 但我也有兴趣看到其他风味的答案.
我正在尝试以布尔模式执行 mysql 全文搜索,并且需要在构建 mysql 查询之前准备搜索文本。
为了实现这一目标,我认为我可以使用 PHP 函数preg_replace并用一种特定模式替换每个捕获组。
"hello world") 之间的单词或句子并在前面添加+( +"hello world")。+前后*( +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 中实现这一点?先感谢您。
编辑/解决方案
感谢 …
我正在\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)
第一行没有任何内容被捕获,但所有(三)行都匹配。
为什么会这样?
capturing-group ×10
regex ×9
java ×2
perl ×2
php ×2
arrays ×1
c# ×1
javascript ×1
line-endings ×1
notepad++ ×1
parameters ×1
preg-replace ×1
recursion ×1
regex-group ×1
string ×1
substitution ×1
url ×1