Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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
用Java中的正则表达式链接文本_Java_Regex - Fatal编程技术网

用Java中的正则表达式链接文本

用Java中的正则表达式链接文本,java,regex,Java,Regex,我在Java webapp中有一个wysiwyg文本区域。用户可以输入文本并设置其样式,或者粘贴一些已经HTML格式的文本 我想做的是把文本链接起来。这意味着,将文本中所有可能的URL转换为其“工作对应项”,即添加… 当我只有纯文本时,此解决方案可以工作: String r = "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;

我在Java webapp中有一个wysiwyg文本区域。用户可以输入文本并设置其样式,或者粘贴一些已经HTML格式的文本

我想做的是把文本链接起来。这意味着,将文本中所有可能的URL转换为其“工作对应项”,即添加

当我只有纯文本时,此解决方案可以工作:

String r = "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";
Pattern pattern = Pattern.compile(r, Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(comment);
comment = matcher.replaceAll("<a href=\"$0\">$0</a>"); // group 0 is the whole expression
String r=“http(s):/([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\!\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
Pattern=Pattern.compile(r,Pattern.DOTALL | Pattern.UNIX | line | Pattern.Pattern不区分大小写);
Matcher-Matcher=pattern.Matcher(注释);
comment=matcher.replaceAll(“”;//组0是整个表达式
但问题是当有一些已经格式化的文本时,即它已经有了标记

因此,我正在寻找某种方法,使模式在两个HTML标记()之间找到文本时不匹配。我读过这篇文章,它可以通过或来实现,但我仍然无法让它工作。我肯定我做错了,因为正则表达式仍然匹配。是的,我一直在玩/调试组,将$0更改为$1等等


有什么想法吗?

也许html解析更适合您(例如)。然后你可以有html节点,在文本中只有“linkify”链接,而在属性中没有链接。

如果你必须自己动手,至少看看Markdown的开源实现中使用的算法/模式,例如,

如果你想使用正则表达式(尽管我认为先解析为XML/html更健壮)我认为向前看或向后看是有道理的。第一步可能是在正则表达式末尾添加以下内容:

(?!</a>)
(?!)
意思是:如果后面有一个结束标记,则不匹配。(当然,这可能会永远被调整。)但这并不好用,因为给定字符串

<a href="...">http://example.com/</a>

这个正则表达式将尝试匹配“”,由于向前看而失败(我们希望如此),然后回溯贪婪的限定符,使其位于末尾,并匹配“”,而“”后面没有一个

您可以通过在+、*和上使用解决后一个问题?操作员-只需在他们后面粘贴a+。这可以防止它们回溯。这可能也是出于性能原因

这对我很有用(请注意三个额外的+):

String r=“http(s):/([\\w+?\\.\\w+])++([a-zA-Z0-9\\~\!\\\\\\\\\\$\%\\\\\\\\\\\\\\\\\\\\\(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;

你很接近了。您可以像这样使用“负面回顾”:


(?如果您真的想使用正则表达式,那么:

   String r = "(?<![=\"\\/>])http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";
String r=“(?])http(s):/([\\w+?\.\\w+])+([a-zA-Z0-9\\~\!\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;

e、 g.检查URL是否不在="或者/>

我想知道还有多少关于这个主题的问题需要解决,这样每个标题的排列都已经存在于so上,人们开始使用以前已经解决的解决方案之一。我花了很多时间研究这个问题,做了一些研究,但仍然无法解决。堆栈溢出帮助我找到了so现在整个社区都可以利用这些答案。你的评论是不准确的,令人不快。我还要求你向我展示一个解决这个问题的方法,这个方法已经在使用“置换标题”@frank06:我的评论远非不准确。我在这里花了很多时间,我已经看到这个问题至少十次了。整个社区显然没有利用它,因为这似乎是不断被问到的。你自己看看:谢谢,这正是我需要的……我真的非常接近它!我总是这样让我们随身携带“正则表达式袖珍参考”;-)
(?<!href=")http:// etc
   String r = "(?<![=\"\\/>])http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";