我需要帮助构建正则表达式删除所有字符,但不包括(数字或字母a-f后跟数字)在Java中:
这是我提出的(不起作用):
string.replaceFirst(".+?(\\d|[a-f]\\d)","");
该行代码用空字符串替换整个字符串。
.+?
是每个字符最多\\d
个数字或[a-f]\\d
任意字母a-f后跟数字。
这不起作用,但是,我可以帮忙吗?
由于
编辑:使用replace
replaceFirst
答案 0 :(得分:2)
首先,replace()
对文字起作用,而不是正则表达式。您应该使用replaceFirst
或replaceAll
,具体取决于您的需求。您的正则表达式问题是您将后缀作为要替换的字符串的一部分。你可以尝试一下:
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
更高效,更易读。