正则表达式的部分匹配

时间:2017-02-06 17:13:49

标签: java regex

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

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

regexX ="",regexA的任何开头 - 任何给定的正则表达式

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

示例:

regexA = a*b

""匹配

"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 
}
}

结果为真。

2 个答案:

答案 0 :(得分:10)

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

您可以通过检查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

答案 1 :(得分:3)

  

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

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

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

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

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

  • a - > a?
  • ab - > ab?
  • a* - > a*
  • a+ - > a*
  • a|b - > (a|b)?
上面的

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