我正在尝试通过一组用于使用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或其他地方讨论过的确切问题,并试图简化我的问题。怎么了?谢谢!
就真正的正则表达式而言,底层的有限状态机将需要〜2ⁱ个状态(其中i是字符串中字母的数目,假设它们都是不同的);它需要跟踪是否看到过每个字母,以存储i位。
但是,我看不到如何用正则表达式语法编写它;受它启发可能会更好,但要手动实现。如果搜索字符串中没有重复,则可以只扫描一次文本(就像真正的正则表达式一样);不过,我看不到如何将其概括为带有重复字母的搜索字符串。