如何使用正则表达式捕获字符串的一部分?

时间:2017-07-01 05:23:52

标签: java regex

(在java中)我想创建一个函数来使用正则表达式提取字符串的一部分:

public HashMap<Integer,String> extract(String sentence, String expression){
} 

//我需要发送一个这样的句子,例如:

HashMap<Integer,String> parts =extract("hello Jhon how are you", "(hello|hi) @1 how are @2");

//表达式验证:句子必须以hello或hi开头,接下来是一个单词或一组单词,接下来是单词:&#34;如何&#34;和其他一些额外的话 //我想得到这个:

parts.get(1) --> "Jhon"
parts.get(2) --> "you"

//但是如果我这样做,这个函数会返回null:

extract("any other words","hello @1 how are @2");

我在没有正则表达式的情况下这样做但代码变得有点大,我不确定使用正则表达式来获得更快的进程是否会更好,我怎么能用正则表达式来做。

1 个答案:

答案 0 :(得分:1)

感谢@ajb的评论。我修改了我的问题以满足奥马尔的要求。 它比我想象的更复杂,哈哈。

我认为Omar希望使用他提供的正则表达式来捕获特定单词。他使用@ 1,@ 2 ... @n来表示他想要捕获的内容,整数值也是从地图中检索目标的关键。

编辑,OP希望将@n放入括号中,我将预处理表达式以将“(”替换为“(?:”。如果是这种情况,该组仍然会生效但不能捕获。

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

public class Test {
    public static void main(String args[]){

        Test test = new Test();
        String sentence1 = "whats the number of apple";
        String expression1 = "whats the (number of @1|@1s number)";
        HashMap<Integer, String> map1 = test.extract(sentence1, expression1);
        System.out.println(map1);
        String sentence2 = "whats the bananas number";
        HashMap<Integer, String> map2 = test.extract(sentence2, expression1);
        System.out.println(map2);
        String sentence3 = "hello Jhon how are you";
        String expression3 = "(hello|hi) @1 how are @2";
        HashMap<Integer, String> map3 = test.extract(sentence3, expression3);
        System.out.println(map3);
    }

    public HashMap<Integer,String> extract(String sentence, String expression){
        expression = expression.replaceAll("\\(", "\\(?:");
        ArrayList<Integer> keys = new ArrayList<Integer>();
        String regex4Expression = "@([\\d]*)";
        Pattern pattern4Expression = Pattern.compile(regex4Expression);
        Matcher matcher4Expression = pattern4Expression.matcher(expression);
        while(matcher4Expression.find()){
            for(int i = 1; i <= matcher4Expression.groupCount(); i++){
                if(!keys.contains(Integer.valueOf(matcher4Expression.group(i)))){
                    keys.add(Integer.valueOf(matcher4Expression.group(i)));
                }
            }
        }
        String regex = expression.replaceAll("@[\\d]*", "([\\\\w]*)");
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(sentence);

        while(matcher.find()){
            ArrayList<String> targets = new ArrayList<String>();
            for(int i = 1; i <= matcher.groupCount(); i++){
                if(matcher.group(i) != null){
                    targets.add(matcher.group(i));
                }
            }
            for(int j = 0; j < keys.size(); j++){
                map.put(j + 1, targets.get(j));
            }
        }
        return map;
    } 
}

结果如下

{1=apple}
{1=banana}
{1=Jhon, 2=you}