Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Regex:Find返回true,但其中一个group()无法返回值_Java_Regex - Fatal编程技术网

Java Regex:Find返回true,但其中一个group()无法返回值

Java Regex:Find返回true,但其中一个group()无法返回值,java,regex,Java,Regex,我对Java中的正则表达式有问题。我测试了我的正则表达式,它似乎匹配得很好,但其中一个组返回的是空值。它能够找到正确的组数,但我不知道为什么第二个序列似乎以错误的索引开始和结束 模式: ^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]?)+([\w\-]*)$ 待测数据: http://www.testing.ca/en/ABC-DEF/uvw_XY5114_2-Z_1_54321 正在查找:XY5114

我对Java中的正则表达式有问题。我测试了我的正则表达式,它似乎匹配得很好,但其中一个组返回的是空值。它能够找到正确的组数,但我不知道为什么第二个序列似乎以错误的索引开始和结束

模式:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]?)+([\w\-]*)$
待测数据:

http://www.testing.ca/en/ABC-DEF/uvw_XY5114_2-Z_1_54321
正在查找:
XY5114

以下是regexplanet的屏幕截图:

编辑:我通过使用以下模式实现了这一点:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]*)([\w\-]*)$
另一种选择是:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]+)([\w\-]*)$
移除
([a-zA-Z0-9]?)+
中的“?”。“?”表示它是可选的,“+”表示至少需要一个,这有点矛盾

编辑:您还必须在组内移动“+”

这应该起作用:

^http\://[\w\-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w\-]+/(uvw_)+([a-zA-Z0-9]+)([\w\-]*)$

您只想提取URL的最后一部分并用下划线分割,这对吗?在这种情况下,请执行以下操作:

String url = ....;
int lastSlash = url.lastIndexOf('/');
String[] parts = url.substring(lastSlash + 1).split("_");

为什么不先使用
URI
将URL分解为组件,以便以后更容易分析?如果可能的话,我想使用Regex做所有事情。在这种情况下,Regex不是最好的tool@Matsemann演出正则表达式在被匹配字符串的长度上是O(n)。在这种情况下,如果您还没有从这些部分(方案、主机、端口等)创建URL对象,那么它可能没有意义。提取URL对象的元素由正则表达式模式执行,尽管它首先使用标准分隔符(如#、?、:)将其拆分,以使字符串尽可能短。现在,它只返回一个值“4”。谢谢,这很有效!我刚才尝试的另一个对我有效的选项是:^http://[\w-\.]+\.[a-zA-Z]{2}/[\w]{2}/[\w-]+/[uvw\]+([a-zA-Z0-9]*)([\w-]*)$我希望只使用正则表达式模式来处理它。但是谢谢你的建议。