gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:43:44 25 4
gpt4 key购买 nike

(在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 开头,接下来是一个单词或一组单词,接下来是单词:“how are”,接下来是其他单词 extra//我想要得到这个:

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

//但是如果我给出这个函数,这个函数将返回 null:

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

我没有使用正则表达式来完成此操作,但代码变得有点大,我不确定使用正则表达式是否会更好,以获得更快的过程,以及如何使用正则表达式来完成它。

最佳答案

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

我认为奥马尔想要使用他提供的正则表达式来捕获特定的单词。他用@1,@2 ... @n来代表他想要捕捉的东西,整数值也是从 map 中检索目标的关键。

编辑,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}

关于java - 如何使用正则表达式捕获字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com