我是否可以使正则表达式完全匹配一次班级中的每个字符-即使班级中的字符重复?

问题描述 投票:-1回答:1

我正在尝试通过一组用于使用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和候选人中的重复字母。

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

PS:投票否决了,我不确定为什么。我进行了认真的研究,找不到在SO或其他地方讨论过的确切问题,并试图简化我的问题。怎么了?谢谢!

java regex puzzle anagram
1个回答
0
投票

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

但是,我看不到如何用正则表达式语法编写它;受它启发可能会更好,但要手动实现。如果搜索字符串中没有重复,则可以只扫描一次文本(就像真正的正则表达式一样);不过,我看不到如何将其概括为带有重复字母的搜索字符串。

© www.soinside.com 2019 - 2024. All rights reserved.