正则表达式(Java)删除所有字符但不包括(数字或字母a-f后跟数字)

时间:2011-03-09 20:28:15

标签: java regex

我需要帮助构建正则表达式删除所有字符,但不包括(数字或字母a-f后跟数字)在Java中:

这是我提出的(不起作用): string.replaceFirst(".+?(\\d|[a-f]\\d)","");

该行代码用空字符串替换整个字符串。 .+?是每个字符最多\\d个数字或[a-f]\\d任意字母a-f后跟数字。

这不起作用,但是,我可以帮忙吗?

由于

编辑:使用replace

更改replaceFirst

4 个答案:

答案 0 :(得分:2)

首先,replace()对文字起作用,而不是正则表达式。您应该使用replaceFirstreplaceAll,具体取决于您的需求。您的正则表达式问题是您将后缀作为要替换的字符串的一部分。你可以尝试一下:

input.replaceFirst(".+?(\\d|[a-f]\\d)","$1")

这里我只是在替换字符串中包含后缀。更正确的方法是使其成为零宽度断言,以便它不会包含在要替换的区域中。你可以使用积极的前瞻:

input.replaceFirst(".+?(?=(\\d|[a-f]\\d))", "")

答案 1 :(得分:2)

我建议采用

的方式
string.replaceFirst(".*?(?=(\\d|[a-f]\\d))", "");

答案 2 :(得分:2)

此处给出的其他答案存在的问题是,如果字符串以a-f后跟数字或数字开头,则它们实际上将匹配并替换第一个字符。不确定这是否是一个相关的场景。这个更复杂的模式应该可以工作:

"([^a-f\\d]|([a-f](?!\\d)))+"

(即,所有不是数字或a-f,或a-f后面没有数字)。

答案 3 :(得分:1)

s = s.replaceFirst(".*?(?=[a-f]?\\d)", "");

使用.*?代替.+?确保前瞻检查第一个字符,解决了@johusman提到的问题。虽然(\\d|[a-f]\\d)不会导致问题,但[a-f]?\\d更高效,更易读。