我可以让正则表达式精确匹配类中的每个字符一次 - 即使字符在类中重复?



我正在尝试通过一组测试,以便在 Java 中使用我的正则表达式查找字谜。 有没有办法使正则表达式匹配,如果输入字符串中的每个字符只使用一次,如果一个或多个字符在输入中出现多次?

给定输入字符串terror我需要匹配rorret,但不是rottet。前两个单词完全共享所有字母,而第三个单词有三个"t"而不是三个"r"。

我目前使用的模式是(?i)^(?!terror)[terror]{6}.

这是方法:

private String baseString;
public String isAnagram(String candidate) {
Pattern p = Pattern.compile("(?i)^(?!"+baseString+")["+baseString+"]{"+baseString.length()+"}");
(p.matcher(candidate).matches()) ? return candidate: return "Not an anagram.";

我尝试过消极的展望:^(?!.*?([terror]).*?1)(?!terror)[terror]{6}

虽然这样可以确保每个字符至少使用一次,但它不能解释 baseString 和候选项中的重复 lettes。

虽然我当然知道这可以通过编程方式解决,但稍微扩展模式以适应我需要的最后一个条件会更好。

就真正的正则表达式而言,底层有限状态机需要 ~2ⁱ 状态(其中 i 是字符串中的字母数,假设它们都是不同的(; 它需要跟踪是否看到每个字母,以存储i位。

但是,我看不出如何在正则表达式语法中编写它;最好从中受到启发,但要手动实现它。由于搜索字符串中没有重复,因此可以只扫描一次文本(就像真正的正则表达式一样(;不过,我看不出如何将其推广到带有重复字母的搜索字符串。

最新更新