正则表达式 - 检测特定 Url 并替换该字符串
Regular Expression - detect Specific Url and replace that string
我想检测字符串中的确切域 url
,然后用另一个字符串更改它,最后使其在 TextView
中可点击。
我想要的:
this is sample text with one type of url mydomain.com/pin/123456. another type of url is mydomain.com/username.
好吧,我写了这个正则表达式:
([Hh][tT][tT][pP][sS]?://)?(?:www\.)?example\.com/?.*
([Hh][tT][tT][pP][sS]?://)?(?:www\.)?example\.com/pin/?.*
这个正则表达式可以检测:
http://www.example.com
https://www.example.com
www.example.com
example.com
Hhtp://www.example.com // and all other wrong type in http
在 .com
之后的任何内容
问题:
1. 如何检测域的结尾(带 space 或点)
2.如何检测两种类型的域,一种有/pin/
,另一种没有?
3. 如何用 PostLink
替换检测到的域,例如 mydomain.com/pin/123
和 ProfileLink
[=23= 替换 mydomain.com/username
]
4. 我知道如何使用 Linkify
使它们可点击,但如果可能的话,请告诉我为 link 提供内容提供商的最佳方式用适当的 activity
打开每个 link
你可以试试:
([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
这是我在 Whosebug 上快速搜索后发现的正则表达式:
Regular expression to find URLs within a string
我刚刚删除了该正则表达式的 http://
部分以满足您的需要。
请注意,正因为如此,它现在会跟踪所有与点连接且没有空格的内容。例如:a.a
也会找到
特别感谢Gildraths
问题 1 的答案
String urlRegex = "(https?://)?(?:www\.)?exampl.com+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?";
Pattern pattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(textString);
问题 2、3 的答案
while(matcher.find()){
// Answer to question 2 - If was true, url contain "/pin"
boolean contain = matcher.group().indexOf("/pin/") >= 0;
if(contain){
String profileId = matcher.group().substring(matcher.group().indexOf("/pin/") + 5, matcher.group().length());
}
// Answer to question 3 - replace match group with custom text
textString = textString.replace(matcher.group(), "@" + profileId);
}
问题 4 的答案
// Pattern to detect replaced custom text
Pattern profileLink = Pattern.compile("[@]+[A-Za-z0-9-_]+\b");
// Schema
String Link = "content://"+Context.getString(R.string.profile_authority)+"/";
// Make it linkify ;)
Linkify.addLinks(textView, profileLink, Link);
我想检测字符串中的确切域 url
,然后用另一个字符串更改它,最后使其在 TextView
中可点击。
我想要的:
this is sample text with one type of url mydomain.com/pin/123456. another type of url is mydomain.com/username.
好吧,我写了这个正则表达式:
([Hh][tT][tT][pP][sS]?://)?(?:www\.)?example\.com/?.*
([Hh][tT][tT][pP][sS]?://)?(?:www\.)?example\.com/pin/?.*
这个正则表达式可以检测:
http://www.example.com
https://www.example.com
www.example.com
example.com
Hhtp://www.example.com // and all other wrong type in http
在 .com
问题:
1. 如何检测域的结尾(带 space 或点)
2.如何检测两种类型的域,一种有/pin/
,另一种没有?
3. 如何用 PostLink
替换检测到的域,例如 mydomain.com/pin/123
和 ProfileLink
[=23= 替换 mydomain.com/username
]
4. 我知道如何使用 Linkify
使它们可点击,但如果可能的话,请告诉我为 link 提供内容提供商的最佳方式用适当的 activity
你可以试试:
([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
这是我在 Whosebug 上快速搜索后发现的正则表达式:
Regular expression to find URLs within a string
我刚刚删除了该正则表达式的 http://
部分以满足您的需要。
请注意,正因为如此,它现在会跟踪所有与点连接且没有空格的内容。例如:a.a
也会找到
特别感谢Gildraths
问题 1 的答案
String urlRegex = "(https?://)?(?:www\.)?exampl.com+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?";
Pattern pattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(textString);
问题 2、3 的答案
while(matcher.find()){
// Answer to question 2 - If was true, url contain "/pin"
boolean contain = matcher.group().indexOf("/pin/") >= 0;
if(contain){
String profileId = matcher.group().substring(matcher.group().indexOf("/pin/") + 5, matcher.group().length());
}
// Answer to question 3 - replace match group with custom text
textString = textString.replace(matcher.group(), "@" + profileId);
}
问题 4 的答案
// Pattern to detect replaced custom text
Pattern profileLink = Pattern.compile("[@]+[A-Za-z0-9-_]+\b");
// Schema
String Link = "content://"+Context.getString(R.string.profile_authority)+"/";
// Make it linkify ;)
Linkify.addLinks(textView, profileLink, Link);