Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript和Java之间正则表达式模式的差异?_Java_Javascript_Regex - Fatal编程技术网

JavaScript和Java之间正则表达式模式的差异?

JavaScript和Java之间正则表达式模式的差异?,java,javascript,regex,Java,Javascript,Regex,在JavaScript中,我有以下内容: function replaceURLWithHTMLLinks(text) { var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; return text.replace(exp,"<a href='$1'>$1</a>"); } 函数replaceurlwithhtm

在JavaScript中,我有以下内容:

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}
函数replaceurlwithhtmlinks(文本){
var exp=/(\b(https?| ftp |文件):\/\/[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig;
返回文本。替换(exp,“”);
}
它将输入字符串中的所有URL替换为URL的一个版本,该版本周围有一个锚定标记,以将其转换为链接。我试图用以下函数在Java中复制此功能:

private String replaceURLWithHTMLLinks(String text) {
    String pattern = "/(\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/i";
    return text.replaceAll(pattern, "<a href=\"$1\">$1</a>");
}
private String replaceurlwithhtmlinks(字符串文本){
字符串模式=“/(\\b(https?| ftp |文件):\\/\/[-A-Z0-9+&@#\/%?=~!:,.;]*[-A-Z0-9+&@#\/%=~)/i”;
返回text.replaceAll(模式“”);
}

然而,尽管它在JavaScript中工作良好,但在Java中找不到任何匹配项,即使是对于相同的输入字符串。我是否需要更改模式中的某些内容,或者正在发生什么?

对于Java示例,您需要去掉表达式周围的斜线和结尾处的
I
。您可以单独指定
i
标志。因此,JavaScript的
/blarg/i
将变成
“(?i)blarg”

您的代码将类似于:

private String replaceURLWithHTMLLinks(String text) {
  String pattern = "(?i)(\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])";
  return text.replaceAll(pattern, "<a href=\"$1\">$1</a>");
}
private String replaceurlwithhtmlinks(字符串文本){
String pattern=“(?i)(\\b(https?| ftp | file):\\/\/[-A-Z0-9+&@#\/%?=~!:,;]*[-A-Z0-9+&@#\/%=~)”;
返回text.replaceAll(模式“”);
}

这很正常:Java的
模式
不是这样工作的

您的正则表达式与这两个引擎都兼容,但是在Java中不以这种方式指定修饰符

做:

Pattern-Pattern=Pattern.compile(\\b(https?| ftp |文件):\\/\/[-A-Z0-9+&@\\/%?=~\\!:,.;]*[-A-Z0-9+&\/%=~\\\]”,Pattern,不区分大小写);
retrun pattern.matcher(text.replaceAll)(“”);

很抱歉出现offtopic,但使用正则表达式解析HTML标记是不安全的,而且是emm。。丑陋的。
Pattern pattern = Pattern.compile("\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])", Pattern.CASE_INSENSITIVE);
retrun pattern.matcher(text).replaceAll("<a href=\"$1\">$1</a>");