Java正则表达式替换开头的每个数字

Java正则表达式替换开头的每个数字,java,regex,Java,Regex,如何用正则表达式替换单词开头的每个数字和下划线,以及单词其余部分中的每个数字,以替换除字母、数字、破折号和点以外的所有字符和下划线 我试过这个正则表达式: ^(\d+)|[^\w-.] 但是,它用一个下划线字符替换开头的所有数字 因此,34567fgf kl.*/676hh被转换为\u fgf-kl.\uuuuuuuuu 676hh,而我需要将开头的每个数字替换为一个下划线字符,如\uuuuuuuuuuuuuuuuuufgf kl.\uuuuuuuuu 676hh 可以使用正则表达式实现吗?您

如何用正则表达式替换单词开头的每个数字和下划线,以及单词其余部分中的每个数字,以替换除字母、数字、破折号和点以外的所有字符和下划线

我试过这个正则表达式:

^(\d+)|[^\w-.]
但是,它用一个下划线字符替换开头的所有数字

因此,
34567fgf kl.*/676hh
被转换为
\u fgf-kl.\uuuuuuuuu 676hh
,而我需要将开头的每个数字替换为一个下划线字符,如
\uuuuuuuuuuuuuuuuuufgf kl.\uuuuuuuuu 676hh


可以使用正则表达式实现吗?

您可以通过以下方法实现:

并且
重复

public static String repeat(String s, int n) {
    if(s == null) {
        return null;
    }
    final StringBuilder sb = new StringBuilder(s.length() * n);
    for(int i = 0; i < n; i++) {
        sb.append(s);
    }
    return sb.toString();
}
公共静态字符串重复(字符串s,int n){
如果(s==null){
返回null;
}
最终StringBuilder sb=新StringBuilder(s.长度()*n);
对于(int i=0;i


另外,
repeat
可以替换为
String repeated=StringUtils.repeat(“25;”,m.group(0.length())使用。

您可以使用负回溯来单独匹配每个前导数字,即任何前面没有非数字的数字

(?<!\D.{0,999})\d|[^\w-.]
(?

由于lookbehind中的限制,它不能是无限的。上面的代码最多可以处理999个前导数字。

您也可以将
replaceAll()
与正则表达式一起使用:

(^\d)|(?<=\d\G)\d|[^-\w.\n]
输出:

_____fgf-kl.___676hh

请给出一些您想要选择的示例有人知道如何处理
[^\w-.]
吗?我正要告诉nau他有一个bug,但我发现它确实有效。它将匹配任何不是单词字符、连字符或点的内容。我可以发誓它将尝试匹配任何不在“单词字符”范围内的内容还有“点”(我想这是一个空集)——你知道,就像
[a-z]
@DavidS:这不是错误,因为连字符不能在字符类中的速记类之后或之前被解析为范围说明符。在这种情况下,它总是被视为文字。但是,在我的回答中,我将它像往常一样放在末尾。只是为了安全起见。谢谢@stribizev。在阅读您的评论后,我能够这是一个参考:“字符类中其他位置的连字符不能形成一个范围,可能会被解释为文字或错误。正则表达式的风格在这方面是非常不一致的。”我认为你最好把它移到最后:这就不那么令人担忧了。
public class Test {
    public static void main(String[] args) {
        String example = "34567fgf-kl.)*/676hh";
        System.out.println(example.replaceAll("(^\\d)|(?<=\\d\\G)\\d|[^\\w.-]", "_"));
    }
}
_____fgf-kl.___676hh