我可以让正则表达式匹配 class 中的每个字符 EXACTLY ONCE - 即使字符在 class 中重复吗?

Can I make a regex match each character in a class EXACTLY ONCE - even when characters REPEAT in the class?

我正在尝试通过一组测试,以在 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]).*?)(?!terror)[terror]{6}

虽然这确保每个字符至少使用一次,但它不能解释 baseString 和 candidate 中的重复字母。

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

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

但是,我看不出如何用正则表达式语法来写这个;受其启发可能更好,但手动实施。在搜索字符串中没有重复的情况下,可以只扫描一次文本(就像真正的正则表达式一样);不过,我看不出如何将其归纳为具有重复字母的搜索字符串。