当前位置: 首页 > 知识库问答 >
问题:

正则表达式拆分并替换字符串-Java

凤安然
2023-03-14

我试图匹配正则表达式模式来替换特定字符串。

示例文本:ABC/1111111 031111111/0318*12345678

\/(\d{12,19})\/(0[1-9]|1[0-2])(\d{2})\*

我想用“/1222”替换03和18 in/0318,即(2022年12月)。我尝试了string replaceAll方法,但它替换了提供的示例字符串中所有匹配的字符。比如下面;

我尝试过的示例代码:

样本文本。替换(匹配器组(2),“12”);

样本文本。替换(匹配器组(3),“22”)

我该怎么做?

共有2个答案

周滨海
2023-03-14

你可以用

(/\d{12,19}/)(?:0[1-9]|1[0-2])\d{2}(\*)

替换为$11222$2。请看regex演示。

详情:

  • (/\d{12,19}/)-第1组:/,12至19位
  • (?:0[1-9]| 1[0-2])-0然后是一个非零数字,或1然后012
  • \d{2}-两位数
  • 第二组($2):一个*字符

查看Java演示

List<String> strs = Arrays.asList(
        "ABC/1111111031111111/0318*12345678", 
        "ABC/1111111031111111/1120*12345678");

String pattern = "(/\\d{12,19}/)(?:0[1-9]|1[0-2])\\d{2}(\\*)";
for (String str : strs)
    System.out.println(str + " => " + str.replaceAll("", "$11222$2"));
贺善
2023-03-14

这是因为您正在使用替换所有匹配项的String replace()将组2(03)中的匹配项替换为12,并将组3(18)中的匹配项替换为22。

Java支持在使用正则表达式的Lookback断言中使用有限量词,您只需将匹配项替换为字符串1222(不需要两个单独的组来匹配这4个数字)。

(?<=/\d{12,19}/)(?:0[1-9]|1[0-2])\d{2}(?=\*)

解释说明

请参阅Java和regex演示。

示例

String sampleText = "ABC/1111111031111111/0318*12345678\n"
        + "ABC/1852111031156311/1120*12345678";

String pattern = "(?<=/\\d{12,19}/)(?:0[1-9]|1[0-2])\\d{2}(?=\\*)";

System.out.println(sampleText.replaceAll(pattern, "1222"));

输出

ABC/1111111031111111/1222*12345678
ABC/1852111031156311/1222*12345678
 类似资料:
  • 我想使用Gson将字符串转换为Foo对象: 下面是我的正则表达式: 如何使用此正则表达式将所有,.和替换为,,而不更改JSON中的键和值?

  • 问题内容: 我有一个字符串,需要根据出现的“,”(逗号)进行拆分,但是需要忽略在一对括号内出现的任何字符串。例如, 应拆分为 问题答案: 对于非嵌套 嵌套 (括号内的括号)

  • 我有一个字符串: 我想用分隔符< code >分割这个字符串 为此,我使用以下方法: 我得到了我需要的东西,除了我失去了分隔符。下面是示例:http://jsfiddle.net/JwrZ6/1/ 如何保留分隔符?

  • 问题内容: 我正在尝试使用正则表达式替换字符串中所有出现的英国汽车登记信息。 当字符串与以下正则表达式完全匹配时,以下swift代码可完美地用于a。 结果是 但是,以下操作无效,并且字符串未修改 结果是 谁能给我任何指示? 问题答案: 您需要删除和锚点。 该装置 开始字符串 和手段 结束字符串 (或行,这取决于选项)。这就是第一个示例起作用的原因:在第一个测试字符串中,字符串的开头实际上是您的模式

  • 我有一个表格形式的命令输出。我正在解析结果文件的输出并将其存储在字符串中。一行中的每个元素由一个或多个空格字符分隔,因此我使用正则表达式匹配1个或多个空格并拆分它。但是,在每个元素之间插入一个空格: 还有更好的方法吗? 每次拆分后,str2都会附加到列表中。

  • 问题内容: 我有以下几种可能的形式的字符串: 我希望能够将它正则化为,基本上替换和之间的所有内容。我试过了: 但这是行不通的。任何帮助表示赞赏。 PS 表示有一个换行符用于此目的。实际上不在那里。 问题答案: 您可以使用 并替换为。请参阅在线Go regex演示。 在这里,匹配并捕获子字符串(它将从替换模式中引用此值),并将匹配并消耗除换行符以外的任何0+字符,直至行尾。 参见Go演示: 输出: