java RegEx如何匹配多个单词,而不仅仅是它找到的第一个单词?[关闭]

kx1ctssn  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(236)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
我有一个RegEx,它只匹配许多单词中的一个。我需要它来匹配(如果它们存在)一个或多个字符串中的单词。字符串可能看起来像这样(意大利语):
“Ciao,mi potrebbe dare l'indirizzo della sua mail?“我需要正则表达式来匹配单词'indirizzo'和'mail'。
这是我的regex:
"(?i)(utente|mail|indirizzo|posta)"
我试着把'+'和'*'放在正则表达式的末尾。
如果字符串中存在一个或多个这样的单词,那么RegEx需要匹配它们吗?我的意思是,如果字符串包含'utente',那么匹配它,但是如果字符串包含' utente','mail'和'indirizzo'匹配所有三个单词,而不是像现在这样只匹配字符串中出现的第一个单词。

50few1ms

50few1ms1#

你不能把'match more than one thing'放在正则表达式里面。
你使用这个正则表达式(你把它传递给例如java.lang.Stringmatches()方法,或者调用Pattern.compile("someregex").matche("someHaystack"),然后调用您得到的Matcher对象上的方法。正是这些电话决定了你要问什么。让你的模式为(posta|indirizzo)+仅仅意味着一个正则表达式将匹配'posta',或'indirizzo',甚至'postapostaindirizzopostaindirizzo',这与你无关。或者,您可以编写一个匹配'indirizzo della sua mail'的regexp-如,中间的'della sua',但听起来不像是您想要的-要点是,正则表达式应用 * 一次,它自己 * 匹配单个区域-具有 * 一个 * 起点和 * 一个 * 端点。但是,你可以多次应用一个正则表达式,当然,每个应用程序仍然有一个开始/结束:

Pattern regex = Pattern.compile("(?i)(utente|mail|indirizzo|posta)");
Matcher m = regex.matcher("Ciao, mi potrebbe dare l'indirizzo della sua mail?");

while (m.find()) {
  System.out.println("Found: " + m.group(0));
}

这将打印:

Found: indirizzo
Found: mail

如果你想例如用其他的东西替换每个'find'-你也可以这样做,匹配子组-你命名它。仔细阅读javadoc of Matcher绝对是一个值得的练习。
另一种对同一输入多次运行相同regexp的“事物”是.replaceAll

System.out.println(
  "Ciao, mi potrebbe dare l'indirizzo della sua mail?"
  .replaceAll("(?i)(utente|mail|indirizzo|posta)", "*POST*"));

将打印:

Ciao, mi potrebbe dare l'*POST* della sua *POST*?

replaceAll是(x.replaceAll(p, y);)的一个可疑的简写(比如,你可能永远都不应该使用它):
1.用正则表达式p生成Pattern
1.通过将该模式应用于'x'来创建一个匹配器。
1.重复运行m.find(),直到没有更多结果。
1.用y替换每个找到的子串。
如果你想偏离这些“轨道”-通过第一个片段,制作一个Matcher对象。

xzv2uavs

xzv2uavs2#

正则表达式模式匹配以从左到右的迭代方式工作。
所以,如果你想匹配多个单词,你有几个选择。
如果条件相对简单,那么只需编写一个模式来匹配所有条件。

.*(?:\bindirizzo\b.*\bmail\b|\bmail\b.*\bindirizzo\b).*

但是,您希望实现的任务可能使用String.contains方法来完成。

String string = "Ciao, mi potrebbe dare l'indirizzo della sua mail?";
boolean matches = string.toLowerCase().contains("indirizzo") && string.toLowerCase().contains("mail");

或者,您可以创建一个方法,该方法将字符串和所需的字符串作为参数。

boolean matches(String string, String... strings) {
    for (String value : strings) {
        if (!string.toLowerCase().contains(value.toLowerCase()))
            return false;
    }
    return true;
}

用途

String string = "Ciao, mi potrebbe dare l'indirizzo della sua mail?";
boolean matches = matches(string, "indirizzo", "mail");
fnx2tebb

fnx2tebb3#

既然你在你的标签中提到了Java,我假设你需要用java来回答,你可以使用java.util.regex包中的PatternMatcher类,如下所示:

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

public class RegexExample {
    public static void main(String[] args) {
        String input = "Ciao, mi potrebbe dare l'indirizzo della sua mail?";
        String patternString = "(?i)\\b(utente|mail|indirizzo|posta)\\b";
        
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(input);
        
        List<String> matches = new ArrayList<>();
        while (matcher.find()) {
            matches.add(matcher.group());
        }
        
        System.out.println(matches);
    }
}

输出如下

[indirizzo, mail]

如果你需要它在python中,你可以参考re库并使用findAll函数,如下所示re.findAll(pattern, string)

相关问题