Regex(Java)删除所有字符(最多但不包括)(数字或字母a-f后跟数字)

Regex(Java)删除所有字符(最多但不包括)(数字或字母a-f后跟数字),java,regex,Java,Regex,我需要帮助构造正则表达式以删除Java中最多但不包括的所有字符(数字或字母a-f后跟数字): 以下是我想到的(不起作用): string.replaceFirst(“.+?(\\d |[a-f]\\d)”,” 这行代码将整个字符串替换为空字符串。 +?是每个字符最多\\d一个数字或[a-f]\\d任何字母a-f后跟一个数字 s = s.replaceFirst(".*?(?=[a-f]?\\d)", ""); 这不起作用,但是,我能得到一些帮助吗 谢谢 编辑:使用replaceFirst更改r

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

以下是我想到的(不起作用):
string.replaceFirst(“.+?(\\d |[a-f]\\d)”,”

这行代码将整个字符串替换为空字符串。
+?
是每个字符最多
\\d
一个数字或
[a-f]\\d
任何字母a-f后跟一个数字

s = s.replaceFirst(".*?(?=[a-f]?\\d)", "");
这不起作用,但是,我能得到一些帮助吗

谢谢

编辑:使用
replaceFirst
更改
replace
,首先,
replace()
作用于文本,而不是正则表达式。您应该根据需要使用
replaceFirst
replaceAll
。您的正则表达式问题是您将后缀作为要替换的字符串的一部分。您可以尝试一下:

input.replaceFirst(".+?(\\d|[a-f]\\d)","$1")
在这里,我只是在替换字符串中包含后缀。更正确的方法是将该断言设置为零宽度断言,这样它就不会包含在要替换的区域中。您可以使用正向前瞻:

input.replaceFirst(".+?(?=(\\d|[a-f]\\d))", "")
首先,
replace()
作用于文本,而不是正则表达式。您应该根据需要使用
replaceFirst
replaceAll
。您的正则表达式问题是您将后缀作为要替换的字符串的一部分。您可以尝试一下:

input.replaceFirst(".+?(\\d|[a-f]\\d)","$1")
在这里,我只是在替换字符串中包含后缀。更正确的方法是将该断言设置为零宽度断言,这样它就不会包含在要替换的区域中。您可以使用正向前瞻:

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

我建议做一些类似于

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

我建议做一些类似于

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

这里给出的其他答案有一个问题,即如果字符串以a-f开头,后跟一个数字,或者仅仅是一个数字,那么它们实际上会匹配并替换第一个字符。不确定这是否是一个相关的场景。不过,这种更复杂的模式应该可以工作:

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

(也就是说,所有不是数字或a-f,或a-f后面没有数字的内容)。

这里给出的其他答案都有一个问题,即如果字符串以a-f开头,后面跟着一个数字,或者只是一个数字,那么它们实际上会匹配并替换第一个字符。不确定这是否是一个相关的场景。不过,这种更复杂的模式应该可以工作:

"([^a-f\\d]|([a-f](?!\\d)))+"
(也就是说,所有不是数字或a-f,或a-f后面没有数字的东西)

使用
*?
而不是
+?
可以确保前向检查程序检查第一个字符,从而解决了@johusman提到的问题。虽然你的
(\\d |[a-f]\\d)
没有引起问题,
[a-f]?\\d
更高效、可读性更强


使用
*?
而不是
+?
可以确保前向检查程序检查第一个字符,从而解决了@johusman提到的问题。虽然你的
(\\d |[a-f]\\d)
没有引起问题,
[a-f]?\\d
效率更高,可读性更强。

replace
对正则表达式不起作用,但它对文本有效。你想用
replaceFirst
?为什么要花那么多精力在代码中可以更容易、更清晰、更快、更好地完成的事情上呢。在这种情况下,REs可能具有的一个优势是编码速度,但是如果你必须到这里来,你已经搞砸了。
replace
不适用于正则表达式,它适用于文本。你想用
replaceFirst
?为什么要花那么多精力在代码中可以更容易、更清晰、更快、更好地完成的事情上呢。在这种情况下,REs的一个优势可能是编码速度,但如果你必须来这里,你已经把它搞砸了。这不起作用,尽管我不知道为什么。这是删除他想保留的结尾的数字。我的第一个想法也是非捕获组。哦,我知道为什么…我很困惑,认为非捕获组是零宽度断言。事实并非如此,因此该组仍在使用中,因此被替换。正如我在回答中所添加的那样,你想要一个积极的展望。虽然我不知道为什么,但这不起作用。这是删除他想保留的结尾的数字。我的第一个想法也是非捕获组。哦,我知道为什么…我很困惑,认为非捕获组是零宽度断言。事实并非如此,因此该组仍在使用中,因此被替换。我在我的答案中添加了一个积极的展望。
$1
和replaceFirst的+1;对于
$1
和replaceFirst,十六进制数字匹配器应该正好是
[0-9a-f]
+1;十六进制数字匹配器应该正好
[0-9a-f]