繁体   English   中英

正则表达式的部分匹配

[英]Partial Matching of Regular Expressions

在NFA中,很容易使所有先前非最终状态接受使其匹配给定语言的所有子串的语言。

在Java regex引擎中,有没有办法找出字符串是否是与给定正则表达式匹配的字符串的起始子字符串?

regexX =“任何开始”,regexA - 任何给定的正则表达式

“regexXregexA”结果表达式匹配匹配“regexA”的所有子字符串:

例:

regexA = a*b

“a”匹配

"regexXa*b"

因为它是“ab”(和“aab”)的开头
编辑:

由于有些人仍然不理解,这里是这个问题的程序测试:

import java.util.regex.*;
public class Test1 {
    public static void main(String args[]){
       String regex = "a*b";
       System.out.println(
       partialMatch(regex, "aaa");
       );
     }
public boolean partialMatch(String regex, String begining){
//return true if there is a string which matches the regex and    
//startsWith(but not equal) begining, false otherwise 
}
}

结果是真的。

您正在寻找的是部分匹配 ,它由Java正则表达式API本机支持(对于记录,提供此功能的其他引擎包括PCRE和boost :: regex)。

您可以通过检查Matcher.hitEnd函数的结果来判断输入字符串是否部分匹配,该函数告诉匹配是否因为到达输入字符串的末尾而失败。

Pattern pattern = Pattern.compile("a*b");
Matcher matcher = pattern.matcher("aaa");
System.out.println("Matches: " + matcher.matches());
System.out.println("Partial match: " + matcher.hitEnd());

这输出:

Matches: false
Partial match: true

在NFA中,很容易使所有先前非最终状态接受使其匹配给定语言的所有子串的语言。

实际上,它可以通过添加新的最终状态和从每个状态(最终或非最终)到新的最终状态的ε-移动来实现。

Afaik没有与此操作等效的正则表达式。

有些正则表达式库可能提供一种方法来验证字符串是否是正则表达式的部分匹配,我不知道。 我不懂Java,我主要在PHP工作,它没有提供这样的功能。 也许有图书馆这样做,但我从来不需要一个。

对于一个小的,特定的正则表达式,您可以尝试通过组合这些简单的规则来构建一个匹配与原始正则表达式部分匹配的字符串的新正则表达式:

  • a - > a?
  • ab - > ab?
  • a* - > a*
  • a+ - > a*
  • a|b - > (a|b)?
  • 等等

上面的ab是原始正则表达式的子正则表达式。 根据需要使用括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM