Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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_Pattern Matching - Fatal编程技术网

如何使用Java正则表达式查找字符串中的所有重复字符序列?

如何使用Java正则表达式查找字符串中的所有重复字符序列?,java,regex,pattern-matching,Java,Regex,Pattern Matching,使用Java和正则表达式解析随机字符串以查找重复序列 考虑字符串: aaabbaaccbb 我想找到一个正则表达式,它将查找上述字符串中的所有匹配项: aaabbaaacccbb ^^^ ^^^ aaabbaaacccbb ^^ ^^ 什么是正则表达式,它将检查字符串中的任何重复字符序列,并返回这些重复字符的组,例如组1=aaa和组2=bb。还要注意,我使用了一个示例字符串,但任何重复字符都是有效的: 龙珠 ... ... ,,,...,, 您可以使用基于正则表达式的正向前

使用Java和正则表达式解析随机字符串以查找重复序列

考虑字符串:

aaabbaaccbb

我想找到一个正则表达式,它将查找上述字符串中的所有匹配项:

aaabbaaacccbb
^^^  ^^^

aaabbaaacccbb
   ^^      ^^
什么是正则表达式,它将检查字符串中的任何重复字符序列,并返回这些重复字符的组,例如组1=aaa和组2=bb。还要注意,我使用了一个示例字符串,但任何重复字符都是有效的: 龙珠
... ... ,,,...,,

您可以使用基于正则表达式的正向前瞻:

((\\w)\\2+)(?=.*\\1)
代码: 输出: 这就是:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String s = "aaabbaaacccbb";
        find(s);
        String s1 = "RonRonRonJoeJoe .... ,,,,";
        find(s1);
        System.err.println("---");
        String s2 = "RonBobRonJoe";
        find(s2);
    }

    private static void find(String s) {
        Matcher m = Pattern.compile("(.+)\\1+").matcher(s);
        while (m.find()) {
            System.err.println(m.group());
        }
    }
}
输出:

aaa
bb
aaa
ccc
bb
RonRonRon
JoeJoe
....
,,,,
---

这似乎可行,但也给出了子序列:

(公平地说,这是根据吉拉姆的准则建立的)


以下内容适用于所有要求。它实际上是这里几个答案的组合,它将打印出字符串中其他任何位置重复的所有子字符串

我将其设置为只返回至少2个字符的子字符串,但通过将正则表达式中的“{2,}”更改为“+”,可以很容易地将其更改为单个字符

publicstaticvoidmain(字符串[]args)
{
字符串s=“RonSamJoeJoeSamRon”;
Matcher m=Pattern.compile((\\S{2,})(?=.*.\\1)”).Matcher(S);
while(m.find())
{

对于(inti=1;i,可以忽略重叠

// overlapped 1 or more chars
(?=(\w{1,}).*\1)
// overlapped 2 or more chars
(?=(\w{2,}).*\1)
// overlapped 3 or more chars, etc ..
(?=(\w{3,}).*\1)
或者,您可以使用(非重叠)


似乎使用基于字典的字符串搜索算法(如)会更好,因为您在开始时不知道模式。您是否需要重复序列是连续的?RonBobRonJoe是否应该返回“Ron?”Ronbobronbobabe
XXYYXY
返回什么“重复字符序列”,你的意思和“重复字符序列”相同吗“?事实上,这不起作用:如果你对Ronjoejoe运行它,它不会打印任何内容。@Reversedgonzo好的,我在帖子中漏掉了它。我现在通过在\\w@ReverendGonzo输出应该是什么?没有重复序列,因此与任何“Ron”都不匹配重复。我的印象是它们不需要是连续的。@ReveredGonzo好的,我现在明白你的意思了。我实际上有一种相反的感觉,它们应该是连续的。OP必须澄清这一点。但是你如何计算文件中每个字符串的元素数,为什么它总是一个3的kmer?
aaa
bb
aaa
ccc
bb
RonRonRon
JoeJoe
....
,,,,
---
public static void main(final String[] args) {
    // final String s = "RonRonJoeJoe";
    // final String s = "RonBobRonJoe";
    final String s = "aaabbaaacccbb";

    final Pattern p = Pattern.compile("(.+).*\\1");

    final Matcher m = p.matcher(s);
    int start = 0;
    while (m.find(start)) {
        System.out.println(m.group(1));
        start = m.toMatchResult().end(1);
    }
}
public static void main(String[] args)
{
  String s = "RonSamJoeJoeSamRon";
  Matcher m = Pattern.compile("(\\S{2,})(?=.*?\\1)").matcher(s);
  while (m.find())
  {
    for (int i = 1; i <= m.groupCount(); i++)
    {
      System.out.println(m.group(i));
    }
  }
}
// overlapped 1 or more chars
(?=(\w{1,}).*\1)
// overlapped 2 or more chars
(?=(\w{2,}).*\1)
// overlapped 3 or more chars, etc ..
(?=(\w{3,}).*\1)
// 1 or more chars
(?=(\w{1,}).*\1) \1
// 2 or more chars
(?=(\w{2,}).*\1) \1
// 3 or more chars, etc ..
(?=(\w{3,}).*\1) \1