【问题标题】:Merge two regexes合并两个正则表达式
【发布时间】:2021-12-30 11:25:02
【问题描述】:

我写了以下正则表达式:

(?:.*[sS]trony [Ll]okalne(?: GW -)? )(.+)(?: nr.+)

它旨在匹配strony lokalne GW - 及其变体(字符串的左侧站点)和nr(字符串的右侧站点)之间的内容。在我的测试用例中,这个正则表达式是有效的。我使用$1 来获取我的捕获组。请查看它捕获的内容(在 ** 和 ** 之间)。

strony lokalne GW - **Częstochowa** nr 28
[ DLO SZ ] - Strony Lokalne **Szczecin** nr 
strony lokalne GW - **Olsztyn** nr 111
[ DLO KI ] - strony lokalne GW - **Kielce** nr 270,
strony lokalne GW - **Łódź** nr 17, 
[ DLO SZ ] - Strony Lokalne **Szczecin** nr 72, 
strony lokalne GW - **Warszawa** nr 125, 
[ DLO KR ] - strony lokalne GW - **Kraków** nr 5, 
[ DLO WA ] - Strony Lokalne **Warszawa** nr 152, 
strony lokalne GW - **Zielona G?a** nr 128, 
strony lokalne GW - **Łódź** nr 63, 

我已经编写了另一个正则表达式来捕获(类似的组),因为我无法一次完成(即使用一个正则表达式)。这是我的第二个正则表达式:

(?:GW -? ?)(.+)(?: nr.+)

这次匹配非常简单:我需要GW 之后和 nr 之前的内容。 下面是一些示例:

GW **Szczecin** nr 50\n"
GW **TORUŃ** nr 96, wydanie z dnia 23/04/2004WYDARZENIA, str. 3\n"
GW **Lublin** nr 33, wydanie z dnia 08/02/2006WYDARZENIA , str. 3\n"
GW **Wrocław** nr 45, wydanie z dnia 23/02/2004WYDARZENIA, str. 3\n"

如何合并这两个正则表达式?

为了获取我在 Java 中使用的捕获组:matcher.replaceAll("$1"),其中 matcher 是来自正则表达式模式的匹配器对象。

【问题讨论】:

  • 请不要将代码放入href;这不利于可读性。

标签: java regex


【解决方案1】:

如果您想保持当前的方法,您可以使用

.*?\b(?:[sS]trony\s+[lL]okalne(?:\s+GW\s+-)?|GW)\s*(.*?)\s*nr.*

请参阅regex demo详情

  • .*? - 除换行符之外的任何零个或多个字符尽可能少
  • \b - 单词边界
  • (?: - 非捕获组的开始:
    • [sS]trony\s+[lL]okalne - Strony/strony,1+ 个空格,lokalne/Lokalne
    • (?:\s+GW\s+-)?|GW) - 一个或多个空格,GW,1+ 个空格,-一个 GW
  • \s* - 零个或多个空格
  • (.*?) - 第 1 组(替换模式中的$1 指的是该组值):除换行符之外的零个或多个字符,尽可能少
  • \s*nr.* - 零个或多个空格、nr 以及零个或多个除换行符以外的字符,尽可能多。

另一种方法是使用正则表达式进行提取,

\b(?:[sS]trony\s+[lL]okalne(?:\s+GW\s+-)?|GW)\s+(.*?)\s+nr\b

this regex demo。见Java demo

import java.util.*;
import java.util.regex.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List<String> strs = Arrays.asList(
            "strony lokalne GW - Częstochowa nr 28","[ DLO SZ ] - Strony Lokalne Szczecin nr ","strony lokalne GW - Olsztyn nr 111","[ DLO KI ] - strony lokalne GW - Kielce nr 270,","strony lokalne GW - Łódź nr 17, ","[ DLO SZ ] - Strony Lokalne Szczecin nr 72, ","strony lokalne GW - Warszawa nr 125, ","[ DLO KR ] - strony lokalne GW - Kraków nr 5, ","[ DLO WA ] - Strony Lokalne Warszawa nr 152, ","strony lokalne GW - Zielona G?a nr 128, ","strony lokalne GW - Łódź nr 63, ","","GW Szczecin nr 50","GW TORUŃ nr 96, wydanie z dnia 23/04/2004WYDARZENIA, str. 3","GW Lublin nr 33, wydanie z dnia 08/02/2006WYDARZENIA , str. 3","GW Wrocław nr 45, wydanie z dnia 23/02/2004WYDARZENIA, str. 3"
        );
        Pattern p = Pattern.compile("\\b(?:[sS]trony\\s+[lL]okalne(?:\\s+GW\\s+-)?|GW)\\s+(.*?)\\s+nr\\b");
        for (String str : strs) {
            Matcher m = p.matcher(str);
            if (m.find()) {
                System.out.println("\"" + str + "\" => " + m.group(1));
            }
        }
    }
}

输出:

"strony lokalne GW - Częstochowa nr 28" => Częstochowa
"[ DLO SZ ] - Strony Lokalne Szczecin nr " => Szczecin
"strony lokalne GW - Olsztyn nr 111" => Olsztyn
"[ DLO KI ] - strony lokalne GW - Kielce nr 270," => Kielce
"strony lokalne GW - Łódź nr 17, " => Łódź
"[ DLO SZ ] - Strony Lokalne Szczecin nr 72, " => Szczecin
"strony lokalne GW - Warszawa nr 125, " => Warszawa
"[ DLO KR ] - strony lokalne GW - Kraków nr 5, " => Kraków
"[ DLO WA ] - Strony Lokalne Warszawa nr 152, " => Warszawa
"strony lokalne GW - Zielona G?a nr 128, " => Zielona G?a
"strony lokalne GW - Łódź nr 63, " => Łódź
"GW Szczecin nr 50" => Szczecin
"GW TORUŃ nr 96, wydanie z dnia 23/04/2004WYDARZENIA, str. 3" => TORUŃ
"GW Lublin nr 33, wydanie z dnia 08/02/2006WYDARZENIA , str. 3" => Lublin
"GW Wrocław nr 45, wydanie z dnia 23/02/2004WYDARZENIA, str. 3" => Wrocław

【讨论】:

  • 亲爱的维克托,非常感谢。我尝试了您的第一个解决方案,但它捕获了我不喜欢被捕获的内容。在这个字符串Gazeta Wyborcza nr 272 中,组Gazeta Wyborcza 被捕获,但它不应该被捕获。你会在你的正则表达式中考虑到它吗?基本上,字符串应该以GW 开头或以strony lokalne 的某种形式开头。
  • @menteith second approach 有效。还有here is the first one - 更新了。
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多