【问题标题】:Replace everything except ONE single char替换除一个单个字符之外的所有内容
【发布时间】:2020-07-13 12:23:19
【问题描述】:

我正在处理一些单元格,我必须从这些单元格中提取某些字母。我想用“”替换整个字符串,除了一个单独的字符。对我来说最大的挑战是告诉我的正则表达式代码只寻找一个字符并删除其他所有内容。 进一步细化和简化;我需要我的正则表达式用“”替换所有内容,除了一个单独的字符(即左右空格或链接到数字)

public class Main {
    public static void main(String[] args) {
        String test = "22A 302 abc";
        String works = test.replaceAll("^\\w[\\s\\S]*", " ");
        System.out.println(works);
        //Desired result: A
    }
}

【问题讨论】:

  • 像这样尝试^[^A-Z]*((?<=[ \d])[A-Z])(?=[ \d])[^A-Z]*$ regex101.com/r/mGKwkb/1 并替换为第1组。或者匹配它而不是环视^.*[\d ]([A-Z])[ \d].*$ regex101.com/r/oas6PP/1
  • @Thefourthbird 我试过了。不会按照我运行时询问的方式替换它
  • 您必须在 Java 中对反斜杠进行双重转义。让我添加演示代码。
  • 我已将更新后的代码添加到答案中。
  • @Thefourthbird 我们有问题。当有逗号例如“22A,02 abc”时,它不会按原意替换 - 它保留这样的值。点和其他特殊字符也是如此

标签: java regex string


【解决方案1】:

您可以在捕获字符 [A-Z] 之前和之后匹配数字或空格。

在替换使用组1中。

^.*[\d ]([A-Z])[ \d].*$

Regex demo | Java demo

如果字符串中只能有一个大写字符:

^[^A-Z]*[\d ]([A-Z])[ \d][^A-Z]*$

Regex demo

示例代码

String test = "22A 302 abc";
String works = test.replaceAll("^.*[\\d ]([A-Z])[ \\d].*$", "$1");
System.out.println(works);

输出

A

要匹配数字 0-9、水平空白字符或标点符号:

String works = test.replaceAll("^.*[\\p{P}0-9\\h]([A-Z])[\\p{P}0-9\\h].*$", "$1");

【讨论】:

  • @WallyAden 所以左边和右边应该是空格、数字或.或,
  • 是的 - 似乎这就是它所缺乏的功能
  • 你可以在字符类中列出你允许的^.*[\d .,]([A-Z])[\d .,].*$regex101.com/r/7R4Uu5/1
  • @WallyAden 如果你想匹配所有标点符号、数字和水平空白字符,你也可以使用String regex = "^.*[\\p{P}0-9\\h]([A-Z])[\\p{P}0-9\\h].*$";
【解决方案2】:

你可以这样做:

public class Test {

    public static void main(String[] args) {
        String test = "22A 302 abc";
        String works = test.replaceAll("\\d+([A-Z]).*", "$1");
        System.out.println(works);
    }
}

输出:

A

解释: 将所有内容替换为捕获组 1(上面给出的代码中的 $1),它只有一个字母 A-Z 前面有一个整数(\\d+),并且可以有之后的任何内容 (.*)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2015-07-26
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多