Java RegEx - 如何防止一行特殊字符被另一个字符替换?
Java RegEx - How to prevent that a row of special characters is replaced by just one other character?
我想用正则表达式(Regex)做的基本上就是.
我目前使用此模式创建 URL 兼容的文件名:
String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]+", "_");
如果有例如
String old_file_name = "!§$%&{}[]()=´´```_lol_á_^_°.PNG";
然后 new_file_name 将是以下具有上述模式的内容:__lol______.PNG
但是,我想要不同的。此正则表达式模式仅通过一个下划线删除了整个连续的特殊字符行,但我希望该模式用其自己的下划线替换特殊字符的每一次出现,这将给我以下结果:
__________________lol______.PNG
有没有办法用正则表达式实现这个?
Post-answer 编辑:
谢谢你们精彩的回答!真的帮了我很多!
为了完整起见,我想为您提供我笨拙且笨拙的代码片段,我用它获得了与您所说的正则表达式相同的结果:
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
你必须删除最后的 + [^a-zA-Z0-9._]
这样你就可以使用 :
String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]", "_");
//-------------------------------------------------------------^
输出
__________________lol______.PNG
因为 +
表示 匹配一次或多次。 但在你的情况下你需要替换所有它们所以你不需要 +
.
正则表达式末尾的“+”表示 "get all of these characters in a row together and replace all of them with this second string." 您想要删除“+”,它应该可以正常工作。您已经在使用 "String.replaceAll()",它将在整个输入字符串中尽可能多地重复替换。
您只需删除“+”即可。这将解决问题。
我想用正则表达式(Regex)做的基本上就是
我目前使用此模式创建 URL 兼容的文件名:
String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]+", "_");
如果有例如
String old_file_name = "!§$%&{}[]()=´´```_lol_á_^_°.PNG";
然后 new_file_name 将是以下具有上述模式的内容:__lol______.PNG
但是,我想要不同的。此正则表达式模式仅通过一个下划线删除了整个连续的特殊字符行,但我希望该模式用其自己的下划线替换特殊字符的每一次出现,这将给我以下结果:
__________________lol______.PNG
有没有办法用正则表达式实现这个?
Post-answer 编辑:
谢谢你们精彩的回答!真的帮了我很多!
为了完整起见,我想为您提供我笨拙且笨拙的代码片段,我用它获得了与您所说的正则表达式相同的结果:
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
你必须删除最后的 + [^a-zA-Z0-9._]
这样你就可以使用 :
String new_file_name = old_file_name.replaceAll("[^a-zA-Z0-9._]", "_");
//-------------------------------------------------------------^
输出
__________________lol______.PNG
因为 +
表示 匹配一次或多次。 但在你的情况下你需要替换所有它们所以你不需要 +
.
正则表达式末尾的“+”表示 "get all of these characters in a row together and replace all of them with this second string." 您想要删除“+”,它应该可以正常工作。您已经在使用 "String.replaceAll()",它将在整个输入字符串中尽可能多地重复替换。
您只需删除“+”即可。这将解决问题。