正则表达式 - 查找字谜和子字谜

Posted

技术标签:

【中文标题】正则表达式 - 查找字谜和子字谜【英文标题】:Regex - find anagrams and sub-anagrams 【发布时间】:2013-01-11 18:23:59 【问题描述】:

我有一个字符池,我想使用正则表达式匹配作为这些字符或这些字符子集的字谜的所有单词。

示例:给定字符串“ACNE”,正则表达式应该给我这些结果:

痤疮 [T] CENA [T] 可以 [T] CAAN [F] CANEN [F]

我已经尝试过这个解决方案/b[acne]1,4/b,但它接受单个字符的多次重复。 我可以怎样做才能最多获取每个字符一次?

【问题讨论】:

Regex 不是解决此问题的正确工具。我建议您使用任何语言的字符串库。 查看这个答案,如果你想用螺丝刀敲钉子:***.com/a/14383513/1400768 或者你可以查看其他答案。这可能与我链接到的问题重复,***.com/questions/14383119/… 【参考方案1】:

“痤疮”这个词的子变位词是这样的词

仅由字母 acne 组成 不要多次包含a 不要多次包含c 不要多次包含n 不要多次包含e

将其编译成正则表达式:

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

测试:regexpal

另外,由于“acne”包含的任何字母不超过一次,“acne”这个词的子变位词是那些

仅由字母 acne 组成 任何字母不得超过一次。

将其编译成正则表达式:

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

测试:regexpal

注意:单词“magmoid”的子字谜可以匹配为

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

(不要包含任何agoid 超过一次,并且不要包含超过两次m

【讨论】:

请注意,这只有在假设字符出现的次数相等时才有可能。可以稍作修改以适应上述情况。 @nhahtdh '因为“acne”不包含任何字母超过一次';第一种方法没有这样的限制。 我说的是第二种方法。是的,第一种方法没有限制。 @useless 正则表达式的重点是举例说明如何为任何特定单词构建正则表达式。第二个正则表达式显示了如何对具有重复字母的字符串执行此操作。预计读者可以从给出的信息中推断出来。可以吗? 但是,字母重复怎么样,您如何使用该正则表达式来匹配例如:doom 作为情绪的变位词?【参考方案2】:

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

为下面的 Java、DataStructure、算法和公司面试问题实践存储库。请随时为存储库做出贡献

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;
    

【讨论】:

以上是关于正则表达式 - 查找字谜和子字谜的主要内容,如果未能解决你的问题,请参考以下文章

查找单词字谜数量的算法?

查找给定单词的字谜

代码高尔夫:查找所有字谜

通过 Python 查找和分组字谜

Python:字谜查找器

javascript中的字谜查找器