目前我得到了:
/(?=(site\.com))site\.com\/u\/(^[\s]+)|\/u\/([^\s]+)/
但它没有按预期工作,我想在“/ u /”之前测试字符串是否有site.com
,如果它已经确定在选择器之前的那个只是在“/ u /”之后选择。
预期结果:
/u/user thhh -> return user
site.com/u/user dsfdsfds -> return user
site2.com/u/user sdfdsfds -> return null
答案 0 :(得分:2)
您可以使用以下正则表达式:
~site\.com/u/(\S+)|(?<!\S)/u/(\S+)~
或者,您也可以在不捕获组的情况下执行此操作。 \K
转义序列重置报告的匹配的起始点,不再包含任何以前消耗的字符。
~site\.com/u/\K\S+|(?<!\S)/u/\K\S+~
答案 1 :(得分:0)
答案 2 :(得分:0)
我首先使用逻辑对输入进行排序,并且仅在分析输入后使用正则表达式。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PostSlashUSlash {
private static final String SPECIAL_SITE = "site.com";
private static final String SLASH_U_REGEX_POST = "/u/(\\w+).*$";
private static final Matcher mtchrPostU = Pattern.compile(
"^" + SLASH_U_REGEX_POST).matcher("");
private static final Matcher mtchrWSpecialSite = Pattern.compile(
"^" + SPECIAL_SITE + SLASH_U_REGEX_POST).matcher("");
public static final void main(String[] ignored) {
System.out.println(getImportantPart("/u/user thhh"));
System.out.println(getImportantPart(SPECIAL_SITE + "/u/user dsfdsfds"));
System.out.println(getImportantPart("site2.com/u/user sdfdsfds"));
}
private static final String getImportantPart(String url) {
if(url.charAt(0) == '/') {
return mtchrPostU.reset(url).replaceAll("$1");
} else if(mtchrWSpecialSite.reset(url).matches()) {
return mtchrWSpecialSite.replaceAll("$1");
}
return null;
}
}
输出:
user
user
null
(我不懂PHP,所以请原谅不同的语言。)
答案 3 :(得分:0)
我知道你已经接受了答案,但是为了在这里完成更短的选择,假设你逐个测试字符串(而不是在其他文本的中间查找它们):
^(?:site\.com)?/u/\K\S+
在php中:
$theregex = '~^(?:site\.com)?/u/\K\S+~';
if (preg_match($theregex, $yourstring)) {
// Yes! It matches!
}
else { // nah, no luck...
}