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正则表达式问题_Java_Regex - Fatal编程技术网

Java正则表达式问题

Java正则表达式问题,java,regex,Java,Regex,我有一个类似的文本 ab1ab2ab3ab4cd 可以创建一个java正则表达式来获取所有以“ab”开头,以“cd”结尾的子字符串吗?e、 g: ab1ab2ab3ab4cd ab2ab3ab4cd ab3ab4cd ab4cd 谢谢看起来您想要的是ab\w+?cd或\bab\w+?cd\b /^ab[a-z0-9]+cd$/gm 若仅 < >代码> b>代码>代码> c>代码>代码>数字0~9/代码>可以在中间出现,如以下例子: /^ab[a-c\d]+cd$/gm 查看实际操作:正

我有一个类似的文本

ab1ab2ab3ab4cd
可以创建一个java正则表达式来获取所有以
“ab”
开头,以
“cd”
结尾的子字符串吗?e、 g:

ab1ab2ab3ab4cd
ab2ab3ab4cd
ab3ab4cd
ab4cd

谢谢

看起来您想要的是
ab\w+?cd
\bab\w+?cd\b

/^ab[a-z0-9]+cd$/gm

若仅<代码> < <代码> >代码> b>代码>代码> c>代码>代码>数字0~9/代码>可以在中间出现,如以下例子:

/^ab[a-c\d]+cd$/gm
查看实际操作:

正则表达式
(?=(ab.*cd))
将这些匹配项分组到组1中,如您所见:

import java.util.regex.*;

public class Main {
  public static void main(String[] args) throws Exception {

    Matcher m = Pattern.compile("(?=(ab.*cd))").matcher("ab1ab2ab3ab4cd");

    while (m.find()) {
      System.out.println(m.group(1));
    }
  }
}
产生:

ab1ab2ab3ab4cd
ab2ab3ab4cd
ab3ab4cd
ab4cd

您需要向前看,
(?=…)
,否则只会得到一个匹配项。请注意,如果字符串中有2张以上的
cd
,则正则表达式将无法生成所需的结果。在这种情况下,您将不得不求助于一些手动字符串算法。

我怀疑第二个字符串更符合他想要的内容,或者更符合他需要的内容。那么您将如何获得与此模式匹配的所有子字符串?不,这将只找到一个子字符串。对不起,误读了问题。通过重复调用
find
(偏移量刚好超过上一次匹配的开始处),您仍然可以找到所有的子字符串,但Bart的解决方案更干净。这将只匹配/验证单个字符串,但OP询问是否有一个正则表达式匹配与特定模式匹配的所有(子)字符串。@Bart我不熟悉Java,它有全局和多行修改器吗?没有,没有全局修改器。你必须自己遍历所有可能的匹配,一旦一个(子)模式被匹配,它就不能成为另一个匹配的一部分:这就是为什么我在回答中使用零宽度前瞻。出于好奇,对于“反向”情况,rx应该如何看?字符串是ab1cd2cd3cd,我要ab1cd,ab1cd2cd,ab1cd2cd3cd@Dudu,您不能使用regex执行此操作:regex引擎从左到右求值。