Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Matcher - Fatal编程技术网

Java递归(?)重复(?)深度(?)模式匹配

Java递归(?)重复(?)深度(?)模式匹配,java,regex,matcher,Java,Regex,Matcher,我试图获取输入字符串中与给定模式匹配的所有子字符串 比如说, 给定字符串:aaxxbbaxb 模式:a[a-z]{0,3}b (我真正想表达的是:所有以a开头,以b结尾的模式,但它们之间最多可以有2个字母) 我想要的确切结果(及其索引): aaxxb:索引0~4 axxb:索引1~4 axxbb:索引1~5 axb:索引6~8 但是,当我使用Pattern.compile()和Matcher.find()运行Pattern和Matcher类时,它只会给出: aaxxb:索引0~4 axb:索引6

我试图获取输入字符串中与给定模式匹配的所有子字符串

比如说,

给定字符串:aaxxbbaxb
模式:a[a-z]{0,3}b
(我真正想表达的是:所有以a开头,以b结尾的模式,但它们之间最多可以有2个字母)

我想要的确切结果(及其索引):

aaxxb:索引0~4
axxb:索引1~4
axxbb:索引1~5
axb:索引6~8

但是,当我使用
Pattern.compile()
Matcher.find()
运行Pattern和Matcher类时,它只会给出:

aaxxb:索引0~4
axb:索引6~8

这是我使用的一段代码

Pattern pattern = Pattern.compile("a[a-z]{0,3}b", Pattern.CASE_INSENSITIVE);
Matcher match = pattern.matcher("aaxxbbaxb");
while (match.find()) {
    System.out.println(match.group());
}
如何检索与模式匹配的每一条字符串


当然,它不必使用模式和匹配器类,只要它是有效的:)

您可以做的一件事是:

  • 创建4个字符或更长的所有可能的子字符串(好 如果您的字符串较大,则祝您好运)
  • 为每个子字符串创建一个新的匹配器
  • 执行匹配()而不是查找()
  • 根据子字符串的相对偏移量和匹配器信息计算绝对偏移量

您实际上是在搜索输入字符串中的字符串ab、a_b和a_b,其中 _表示您不关心其值的非空白字符

这是三个搜索目标。我能想到的最有效的方法是使用一种类似算法的搜索算法,稍加修改。实际上,您的伪代码类似于:

for i in 0 to sourcestring.length
    check sourcestring[i] - is it a? if so, check sourcestring[i+x] 
       // where x is the index of the search string - 1
    if matches then save i to output list
    else i = i + searchstring.length
显然,如果您有一个位置匹配,那么必须检查子字符串的内部字符,以确保它们是按字母顺序排列的

运行算法3次,每个搜索项一次。毫无疑问,这将比尝试使用模式匹配进行搜索快得多

编辑-抱歉,没有正确阅读问题。如果您必须使用正则表达式,则上述操作将不适用于您。

(请参阅:)

这是我提出的完整解决方案。它可以在原始正则表达式中处理零宽度模式、边界等。它检查文本字符串的所有子字符串,并通过在模式的开头和结尾填充适当数量的通配符来检查正则表达式是否仅在特定位置匹配。它似乎适用于我尝试过的案例——尽管我还没有做过广泛的测试。毫无疑问,它的效率比它可能的要低

  public static void allMatches(String text, String regex)
  {
    for (int i = 0; i < text.length(); ++i) {
      for (int j = i + 1; j <= text.length(); ++j) {
        String positionSpecificPattern = "((?<=^.{"+i+"})("+regex+")(?=.{"+(text.length() - j)+"}$))";
        Matcher m = Pattern.compile(positionSpecificPattern).matcher(text);

        if (m.find()) 
        {   
          System.out.println("Match found: \"" + (m.group()) + "\" at position [" + i + ", " + j + ")");
        }   
      }   
    }   
  }
publicstaticvoidallmatches(字符串文本、字符串正则表达式)
{
对于(int i=0;i对于(int j=i+1;j)为什么这里有点
a[a-z]。{0,2}b
?如果你想让patern
a_b
其中
\u
可以是0-2个字母字符,那么这里的点是错误的,不是吗
aaxxbb
一个字符串“以a开头,以b结尾”最多可以有两封信?谢谢Tom和jmg指出这一点!!!我编辑了原始帖子。嗯…搜索了三个单独的目标。谢谢,我会查出来的!