Java RegEx - 如何防止一行特殊字符被另一个字符替换?

Bru*_*tig 1 java regex string replaceall

我想用正则表达式(正则表达式)做什么基本上与此请求相反.

我目前使用此模式创建与URL兼容的文件名:

String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]+", "_"); 
Run Code Online (Sandbox Code Playgroud)

如果有例如示例

String old_file_name = "!§$%&{}[]()=´´```_lol_á_^_°.PNG";
Run Code Online (Sandbox Code Playgroud)

那么new_file_name将是以下模式: __lol______.PNG

但是,我希望以不同的方式.这个正则表达式模式通过一个下划线删除整个连续的特殊字符行,但我希望该模式用自己的下划线替换每个特殊字符的单个事件,这将给我这个结果:

__________________lol______.PNG 
Run Code Online (Sandbox Code Playgroud)

有没有办法用正则表达式实现这一目标?

回答后编辑:
谢谢你们的精彩回答!真的帮到了我很多!为了完整起见,我想为您提供我笨重而笨拙的代码片段,我用它来表达相同的结果,就像你说的正则表达式:

  for(int i = 0; i < old_file_name.length(); i++)
    {
        // if it is a letter, a number, a underscore or a dot
        if(     (((int)old_file_name.charAt(i) > 47)  &&  ((int)old_file_name.charAt(i) < 58 )) ||
                (((int)old_file_name.charAt(i) > 64)  &&  ((int)old_file_name.charAt(i) < 91 )) ||
                (((int)old_file_name.charAt(i) > 96)  &&  ((int)old_file_name.charAt(i) < 123 )) ||
                ((int)old_file_name.charAt(i) == 95) ||
                ((int)old_file_name.charAt(i) == 46)  )
        {

            // do nothing
        } // end if
        else
        {
            new_file_name = new_file_name.replace(old_file_name.charAt(i), '_');

            // System.out.println("Step " + i + " : " + new_file_name); // for debugging
        } // end if-else
     } // end for 
Run Code Online (Sandbox Code Playgroud)

YCF*_*F_L 5

您必须删除最后的+,[^a-zA-Z0-9._]以便您可以使用:

String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]", "_");
//-------------------------------------------------------------^
Run Code Online (Sandbox Code Playgroud)

产量

__________________lol______.PNG 
Run Code Online (Sandbox Code Playgroud)

因为+平均值匹配一次或多次.但在你的情况下你需要更换所有它们,所以你不需要+.