gpt4 book ai didi

Java 正则表达式模式未按预期工作

转载 作者:行者123 更新时间:2023-11-30 08:37:45 24 4
gpt4 key购买 nike

我是模式和正则表达式的新手,遇到了一个我无法解决的问题。这是我的代码:

public static void main(String[] args) {

Pattern pattern = Pattern.compile("(!?)(fw|ri|le|cl|rs)[\\s,]*(\\d*\\.*\\d*|\"\\w*\")?[\\s,]*(\\d*\\.*\\d*|\"\\w*\")?[\\s,]*(\\d*\\.*\\d*|\"\\w*\")?");
Matcher matcher = pattern.matcher("!fw 90.0 \"hello\" 70.0");

matcher.find();
for(int i = 0; i < matcher.groupCount()+1; i++) {
System.out.println("Group "+i+") " + matcher.group(i));
}
}

所以,我使用了 regexr.com创建正则表达式,并在网站上按计划运行。它应该找到 3 个参数,可以是数字或字符串,其中字符串用引号括起来。正如我所说,在 regexr.com它有效,但在 java 中它只在没有字符串时有效。我究竟做错了什么?(没有额外反斜杠的正则表达式是(!?)(fw|ri|le|cl|rs)[\s,]*(\d*\.*\d*|"\w*")?[\s,]*(\d*\.*\d*|"\w*")?[\s,]*(\d*\.*\d*|"\w*")? )

提前致谢。

编辑:发生了什么和没有发生什么的一些例子:

按预期工作:

输入:!fw 1.0 2.0 3.0

输出:
组 0) !fw 1.0 2.0 3.0
第 1 组)!
第 2 组)fw
第 3 组)1.0
第 4 组)2.0
第 5 组)3.0

未按预期工作:

输入:!fw 1.0\"hello\"3.0

输出:
组 0) !fw 1.0
第 1 组)!
第 2 组)fw
第 3 组)1.0
第 4 组)
第 5 组)

预期输出:
组 0) !fw 1.0 "你好"3.0
第 1 组)!
第 2 组)fw
第 3 组)1.0
第 4 组)“你好”
第 5 组)3.0

最佳答案

如果您切换字符串和数字的表达式顺序,您可以让您的正则表达式工作:

(!?)(fw|ri|le|cl|rs)[\\s,]*(\"\\w*\"|\\d*\\.*\\d* )?[\\s,]*(\"\\w*\"|\\d*\\.*\\d*)?[\\s,]*(\"\\w*\"\\d*\\.*\\d*)?

但是,我不确定您的正则表达式是否完全符合您的要求 - 它匹配更多,更具体地说。例如:

!fw ...""

这是因为您的正则表达式中有太多内容是可选的,或者可以重复任意次数。 (就像点一样,我猜这不是你想要的。)假设您想要恰好 3 组字符串或带有可选小数点的数字以及空格、逗号或不分隔它们的任何内容,您应该使用此正则表达式:

(!?)(fw|ri|le|cl|rs)([\\s,]*(\"\\w*\"|\\d+(\\.\\d+) ?)[\\s,]*){3}

这将匹配如下字符串:

!fw 90.0\"你好\"70.0

!fw\"你好\"70.0

!fw\"hello\"70.0

但不会匹配

!fw ...\"\"

这是因为在你的正则表达式中,你指定了 \\d*\\.*\\d*,意思是“0-n 个数字,0-n 个点,0-n 个数字” .通过将 \\.* 更改为 \\.? 您指定“0-1 点”,这会解决您的点问题。但是您仍然会将 ..9 匹配到此正则表达式,这就是为什么您使用 + 强制第一个数字,然后添加一个小数点的可选参数 (\\.d+)?,意思是“1 个点和 1-n 个数字”。现在它将匹配不带小数点的数字和带小数点的数字,但不匹配 3..3 等数字。

{3} 指定您恰好需要该组出现 3 次。如果您使用 * 将这些组保留为可选,您还将获得输入模式出现 0-2 次的结果。如果这是您的预期行为,您应该考虑是否要允许在数字/字符串之间出现多个空格或逗号。如果没有,你应该让他们依赖于之前是否有一个字符串/数字。

关于Java 正则表达式模式未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com