正则表达式 - 查找变位词和子变位词

6
我有一组字符,我想使用正则表达式匹配其中所有与这些字符的字谜或子集的字谜相匹配的单词。
例如:给定字符串“ACNE”,正则表达式应返回以下结果:
- ACNE [T] - CENA [T] - CAN [T] - CAAN [F] - CANEN [F]
我尝试了这个解决方案/b[acne]{1,4}/b,但它接受多个重复的单个字符。我该怎么办才能确保每个字符仅匹配一次?

4
正则表达式不是这个问题的正确工具。我建议您使用任何语言中的字符串库来处理。 - Rohit Jain
如果你想用螺丝刀钉钉子,可以查看这个答案:http://stackoverflow.com/a/14383513/1400768 或者你可以查看其他答案。它可能是我链接的问题的重复,http://stackoverflow.com/questions/14383119/check-if-string-is-subset-of-a-bunch-of-characters-regex/14383513 - nhahtdh
2个回答

9

单词“acne”的子异序词是仅包含字母acne,且不超过一个字母a,一个字母c,一个字母n和一个字母e的单词。

将此编译成正则表达式:

^(?!.*a.*a)(?!.*c.*c)(?!.*n.*n)(?!.*e.*e)[acne]*$

测试:regexpal

另外,由于“acne”中没有任何字母重复,因此单词“acne”的子异序词是仅由字母“acne”组成且不包含任何重复字母的单词。

  • 仅由字母acne组成
  • 不包含任何重复字母

将其编译为正则表达式:

^(?!.*(.).*\1)[acne]*$

测试:正则表达式在线测试

注意:单词“magmoid”的子异序词可以匹配为:

^(?!.*([agoid]).*\1)(?!(.*m){3})[magoid]*$

(不包含多个 agoid,也不超过两个 m

请注意,只有在假设字符出现的次数相等的情况下才能实现此操作。可以稍微修改一下以适应上述情况。 - nhahtdh
@useless 正则表达式的目的是通过示例展示如何为任何特定单词构建正则表达式。第二个正则表达式展示了如何处理具有重复字母的字符串。预计读者可以从所提供的信息中推断出更多内容。你能做到吗? - John Dvorak
但是,字母重复怎么办?你如何使用正则表达式来匹配例如:doom作为mood的变位词? - useless
@useless 第二个正则表达式(和描述)展示了如何处理带有重复的字母。我应该详细说明如何优化正则表达式,如果多个字母具有相同数量的最大重复次数,或者如何从第二个示例中推断吗? - John Dvorak
从 magmoid 的例子中推断出来是没有用的,mood 应该是 ^(?!.*([md]).*\1)(?!(.*o){3})[mod]*$ - John Dvorak
显示剩余2条评论

0

使用正则表达式查找给定字符串中单词的字谜数量的代码

分叉以下存储库以进行Java、数据结构、算法和公司面试问题实践。请随意为存储库做出贡献。

https://github.com/arpans2112/techsqually-java8-best-practices/blob/master/src/com/techsqually/java/library/util/regularexpression/anagramStrings.java

package com.techsqually.java.library.util.regularexpression;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class anagramStrings {


    public static void main(String[] args) {

       int count = findAnagramsInAGivenStrings("arpan","Hi arpan Aarpn we are testing rapan rranp anagram");
        System.out.println(count);
    }


    /**
     * <p> Use to find the number of anagrams of a word in a Given String</p>
     * @param : word : is the word for which you want to find the anagrams
     * @param : givenString : is the string in which you want to find the anagrams of word given
     * @return : total number of anagrams of the word passed
     *  
     *  all words in which each character count is same but their order can be different 
     *  e.g arpan and rapan are anagrams 
     *  
     * @output of above given example is 3, "arpan" , "Aarpn" and rapan are anagrams of arpan
     * */
    public static int findAnagramsInAGivenStrings(String word, String givenString){

        word = word.toLowerCase();
        givenString = givenString.toLowerCase();
        HashMap<String,Integer> numberOfAnnagrams = new HashMap<>();
       Matcher matcher = Pattern.compile("[" + word + "]{" + word.length() + "}").matcher(givenString);

       int count = 0;
        while (matcher.find()){

                 char[] matchWordArray = matcher.group().toCharArray();
                 char[] givenWordArray = word.toCharArray();
            Arrays.sort(matchWordArray);
            Arrays.sort(givenWordArray);

            if (Arrays.equals(matchWordArray,givenWordArray)) count++;
        }

        return count;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接