(在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");
我在没有正则表达式的情况下这样做但代码变得有点大,我不确定使用正则表达式来获得更快的进程是否会更好,我怎么能用正则表达式来做。
答案 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}