在Java中从字符串中删除前导、尾随的非数字字符。

4
我需要从一个字符串中剥离首尾的所有字符,直到第一个和最后一个数字为止。
例如:OBC9187A-1%A
应该返回:9187A-1 在Java中怎么实现呢?
我知道正则表达式是解决方案,但我不擅长它。 我尝试过这个:replaceAll("([^0-9.*0-9])","")
但它只返回数字并去掉所有字母/特殊字符。

2
正则表达式是一个不错的起点... - brso05
1
你能否编辑你的问题并发布你的尝试?同时解释一下在创建解决方案时遇到的问题。你只需要一个正则表达式,它将查找“数字”、“任意字符的一个或多个”、“数字”。这似乎不是非常复杂的事情。 - Pshemo
我编辑了我的问题,包括我所做的事情。 - user2166045
2个回答

3
这是一个使用 regexjava 解决问题的自包含示例。建议查看一些正则表达式教程,这里有一个不错的教程。
public static void main(String[] args) throws FileNotFoundException {
    String test = "OBC9187A-1%A";
    Pattern p = Pattern.compile("\\d.*\\d");
    Matcher m = p.matcher(test);

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

输出:

Match: 9187A-1

\d 匹配任何数字。.* 匹配0次或多次的任何内容。 \d 匹配任何数字。我们使用 \\d 来转义 Java 中的 \,因为 \ 是一个特殊字符。所以此正则表达式将匹配一个数字,后面跟着任何东西,再跟着另一个数字。这是贪婪的,它会取最长/最大/最贪婪的匹配,因此它将获取第一个和最后一个数字以及它们之间的任何内容。这里使用 while 循环是因为如果有多个匹配项,则会循环遍历所有匹配项。在此情况下,只能有1个匹配项,因此可以省略 while 循环或者像这样更改为 if:

if(m.find()) 
{
    System.out.println("Match: " + m.group());
}

我使用了类似的replaceAll表达式,但它没有起作用,只返回了数字。 - user2166045
@user2166045 你用了什么表达式? - brso05
在这种情况下,您可以使用 replaceAll。下面有两个示例,但是由于您正在尝试从 String 中提取匹配项,我建议使用 PatternMatcher 来匹配部分 String。这允许您保留原始的 String,或者使用匹配的 String 替换它 myString = m.group(); - brso05

3
这将从字符串s中剥离前导和尾随的非数字字符。
String s = "OBC9187A-1%A";
s = s.replaceAll("^\\D+", "").replaceAll("\\D+$", "");
System.out.println(s);
// prints 9187A-1

演示

正则表达式解释
^\D+

^ assert position at start of the string
\D+ match any character that's not a digit [^0-9]
     Quantifier: + Between one and unlimited times, as many times as possible

\D+$

\D+ match any character that's not a digit [^0-9]
     Quantifier: + Between one and unlimited times, as many times as possible
  $ assert position at end of the string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接