使用replaceall()擦除任何与模式不匹配的字符串

时间:2018-12-29 16:44:18

标签: java regex

我需要用""替换所有不遵循模式的字符。

我有如下字符串:

MCC-QX-1081
TEF-CO-QX-4949
SPARE-QX-4500

到目前为止,我正在使用以下正则表达式。

String regex = "[^QX,-,\\d]";

使用replaceAll字符串方法,我得到QX1081,预期结果为QX-1081

3 个答案:

答案 0 :(得分:0)

您使用的character class匹配单个字符,而不是模式。

您想要类似的东西

String resultString = subjectString.replaceAll("^.*?(QX-\\d+)?$", "$1");

只要字符串中的QX-digits部分没有任何内容,它就可以工作。

答案 1 :(得分:0)

将破折号放在正则表达式的末尾:[^ QX,\ d-] 接下来,您只需要子字符串即可过滤掉第一个破折号。 不完全知道对所有字符串的期望,但是如果要匹配字符类中的破折号,则必须将其设置为最后一个字符。

答案 2 :(得分:0)

您正在使用一个字符类,在该字符类中,您必须转义连字符或像store.js那样将其放在开头或结尾,否则您要匹配从逗号到逗号的范围。但是更改它会给您[^QX,\d-],这不是理想的结果。

您可以匹配您的模式,然后替换为第一个捕获组-QX-1081

$1

在Java中,您必须对与数字^(?:[A-Z]+-)+(QX-\d+)$ 匹配的数字进行两次转义

这将匹配:

  • \\d字符串的开头
  • ^重复1次以上一个或多个大写字符,再加上连字符
  • (?:[A-Z]+-)+捕获成组(QX-\d+),后跟1个以上数字
  • QX-字符串的结尾

例如:

$

请参见Regex demo | Java demo

请注意,如果仅执行一次替换,则也可以使用String result = "MCC-QX-1081".replaceAll("^(?:[A-Z]+-)+(QX-\\d+)$", "$1"); System.out.println(result); // QX-1081