Java URL中有效图像的正则表达式

Java URL中有效图像的正则表达式,java,regex,regex-negation,Java,Regex,Regex Negation,首先,我知道stackoverflow中有很多正则表达式线程,我检查了很多,但是很难匹配正确的句子 我目前正在尝试匹配以下字符: -a-z -A-Z - 0-9 -.()~-\[] 在这个正则表达式中,后面要做的是用空格替换所有不匹配的字符 我正在使用的文件名示例如下: -12345677-FIEBERTHOMETER-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%”和*()!ßöäÄÜÖ“'][}{:;,º.jpg 正如您在代码中看到的,字符的替换是

首先,我知道stackoverflow中有很多正则表达式线程,我检查了很多,但是很难匹配正确的句子

我目前正在尝试匹配以下字符: -a-z -A-Z - 0-9 -.()~-\[]

在这个正则表达式中,后面要做的是用空格替换所有不匹配的字符

我正在使用的文件名示例如下: -12345677-FIEBERTHOMETER-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%”和*()!ßöäÄÜÖ“'][}{:;,º.jpg

正如您在代码中看到的,字符的替换是以regex的否定表示valid,但我也不确定这是否应该是这样,因为所有匹配都是false

第一个问题:即使文件名正确,匹配也总是错误的,这会导致创建一个新文件并更改上次修改日期,保持不变很重要

第二个问题:逗号和星号始终保留在文件名中,但这也可能是由于错误的正则表达式造成的

有效名称的示例: -12345677-FIEBERTHERMETER-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0_~()][.jpg


我在这里遗漏了什么我找不到的?

我用notepad++复制了它,但我会尝试用java来做

没有什么问题。您应该匹配有问题的字符,如果找到了这些字符,则替换它们。使用find()而不是matches,因为您不需要匹配整个字符串

在记事本中,我只需将[^a-zA-Z0-9.[]\-~+]替换为“”,我就得到了您想要的

在爪哇

import java.util.regex.*;

public class HelloWorld{

public static void main(String[] args) {
     String wrong="12345677-fieberthermometer-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%\"&*()!ßöäüÄÜÖ\"'][}{<>:;,º.jpg";
     String pattern="[^a-zA-Z0-9\\.\\(\\)\\[\\]\\-~_]+";
     Pattern p = Pattern.compile(pattern);
     Matcher m = p.matcher(wrong);
     if (m.find()){
                right = wrong.replaceAll(pattern, "");
                System.out.println(right);
     }
  }
}
import java.util.regex.*;
公共类HelloWorld{
公共静态void main(字符串[]args){
字符串错误=“12345677-Fieberthermeter-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@$%\”和*()!ßöääÄÜÖ\'][}{:,º.jpg”;
字符串模式=“[^a-zA-Z0-9\\.\\(\\)\[\\]\-~+”;
Pattern p=Pattern.compile(Pattern);
匹配器m=p.Matcher(错误);
if(m.find()){
正确=错误。replaceAll(模式“”);
System.out.println(右);
}
}
}

我用记事本++复制了它,但我会尝试用java

没有什么问题。您应该匹配有问题的字符,如果找到了这些字符,则替换它们。使用find()而不是matches,因为您不需要匹配整个字符串

在记事本中,我只需将[^a-zA-Z0-9.[]\-~+]替换为“”,我就得到了您想要的

在爪哇

import java.util.regex.*;

public class HelloWorld{

public static void main(String[] args) {
     String wrong="12345677-fieberthermometer-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@#$%\"&*()!ßöäüÄÜÖ\"'][}{<>:;,º.jpg";
     String pattern="[^a-zA-Z0-9\\.\\(\\)\\[\\]\\-~_]+";
     Pattern p = Pattern.compile(pattern);
     Matcher m = p.matcher(wrong);
     if (m.find()){
                right = wrong.replaceAll(pattern, "");
                System.out.println(right);
     }
  }
}
import java.util.regex.*;
公共类HelloWorld{
公共静态void main(字符串[]args){
字符串错误=“12345677-Fieberthermeter-fuer-schlaefe-und-ohr-digital-mapa-nuk-d0@$%\”和*()!ßöääÄÜÖ\'][}{:,º.jpg”;
字符串模式=“[^a-zA-Z0-9\\.\\(\\)\[\\]\-~+”;
Pattern p=Pattern.compile(Pattern);
匹配器m=p.Matcher(错误);
if(m.find()){
正确=错误。replaceAll(模式“”);
System.out.println(右);
}
}
}


我想你错过了
+
模式p=Pattern.compile(“[”+URL\u VALID\u REGEX++”);
m.matches()
需要一个完整的字符串匹配。事实上,这是缺少的,现在我可以看到加号后的值是真的。正则表达式让我抓狂,因为一个字符可以改变整个结果哈哈。谢谢你的提示!再想一想,
*
Modifier在这种情况下更好。好吧,无论如何,检查一下什么最适合你,
+
*
使用+和*,有什么区别?如果我记录好,+至少需要1个字符串,而*可以是无字符串,对吗?当您使用
+
时,空字符串将使用
replaceAll
进行处理。如果您之前有空字符串检查,这可能不是问题。我想您错过了ed
++
模式p=Pattern.compile(“[”+URL\u VALID\u REGEX++)”;
m.matches()
需要一个完整的字符串匹配。事实上,这是缺少的,现在我可以看到加号后的值是真的。正则表达式让我抓狂,因为一个字符可以改变整个结果哈哈。谢谢你的提示!再想一想,
*
Modifier在这种情况下更好。好吧,无论如何,检查一下什么最适合你,
+
*
。使用+和*,有什么区别?如果我记录好,+至少需要1个字符串,而*可以是无字符串,对吗?当您使用
+
时,空字符串将使用
replaceAll
处理。如果您之前检查过空字符串,这可能不是问题。答案是否定的t相关。每个文件都与此匹配,因为每个文件都至少有一个匹配字符。-错误,
[a-z]
匹配
仅与只有1个字符的字符串匹配。因此,您应该与有问题的字符匹配,如果发现有问题的字符,请将其替换为-OP,请参阅
name=name.replaceAll(“[^”+URL\u VALID\u REGEX+“]”,“”);
。您需要转义“-”-OP模式包含一个转义的
-
。很抱歉,可能我解释错了。我现在修复了答案,并添加了一个运行中的java示例。您刚刚重新发明了OP代码。该步骤已经在OP代码中运行。在与
replaceAll
一起使用的模式中,您不需要
+
,尽管它更符合逻辑。但不是必需的不需要,因为它将替换找到的每个字符,但会使正则表达式更具可读性和可靠性(但不确定)它将有更好的性能-至少在我的头脑中可能我正在重新发明,但我的工作;)和OP不相关…答案是不相关的。每个文件都与此匹配,因为每个文件至少有一个匹配字符。-错误,
[a-z]
with
matches
只匹配一个只有1个字符的字符串。因此,您应该匹配有问题的字符,如果发现有问题的字符,请将其替换为-OP,请参见