Для вашей конкретной проблемы определенно используйте функцию обратного вызова, как говорит Томалак.
За проблему всех этих косых черт и множества других странностей ...
Вот ваше текущее Java-регулярное выражение, разбитое на строки:
(?<![=\"\"\\/>])
(www\\.|(http|https|ftp|news|file)(s)?://)
([\\w+?\\.\\w+])+
([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?
([^.|'|# |!])
И то же самое, что и регулярное выражение, не относящееся к Java (строка Java не экранируется):
(?<![=""\/>])
(www\.|(http|https|ftp|news|file)(s)?://)
([\w+?\.\w+])+
([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?
([^.|'|# |!])
А вот описание того, что с ним не так ...:)
Первая строка - вы дублируете "
в классе символов и вам не нужно экранировать /
Вторая строка - хорошо, за исключением того, что я не уверен, что вы ищете с частью (s)?
, так как у вас все равно есть https в предыдущей группе.
Строка третья - вы знаете, что у вас есть класс персонажей? квантификаторы не работают. Вы, вероятно, хотите вместо (\w+?\.\w+)+
. (Это (\\w+?\\.\\w+)+
в строке Java.)
Строка четвертая - Ух ты, сколько побега !! Почти все ненужное. Попробуйте: ([a-zA-Z0-9~!@#$%^&*()_\-=+\/?.:;',]*)?
(и снова: ([a-zA-Z0-9~!@#$%^&*()_\\-=+\\/?.:;',]*)?
)
Строка пять - чередование внутри класса символов ничего не делает. Это будет делать: [^.'#!]
, и добавить один |
, если вы действительно хотите запретить использование символов канала.
Объединение всех этих комментариев дает следующее регулярное выражение:
(?<![="/>])
(www\.|(http|https|ftp|news|file)://)
(\w+?\.\w+)+
([a-zA-Z0-9~!@#$%^&*()_\-=+\/?.:;',]*)?
([^.'# !])
Или, еще раз, с экранированием для Java:
(?<![=\"/>])
(www\\.|(http|https|ftp|news|file)://)
(\\w+?\\.\\w+)+
([a-zA-Z0-9~!@#$%^&*()_\\-=+\\/?.:;',]*)?
([^.'# !])
Обратите внимание, насколько это проще!
Возвращаясь к единственной строке, это дает:
(?<![="/>])(www\.|(http|https|ftp|news|file)://)(\w+?\.\w+)+([a-zA-Z0-9~!@#$%^&*()_\-=+\/?.:;',]*)?([^.'# !])
или
(?<![=\"/>])(www\\.|(http|https|ftp|news|file)://)(\\w+?\\.\\w+)+([a-zA-Z0-9~!@#$%^&*()_\\-=+\\/?.:;',]*)?([^.'# !])
Но я бы придерживался многострочного - просто вставьте (?x)
в самом начале, и это действительное регулярное выражение, которое игнорирует пробел, и вы можете использовать # для комментирования - всегда хорошо с регулярными выражениями. как это!