正则表达式如果包含X选择Y否则选择Z.

时间:2014-07-12 15:35:37

标签: php regex

目前我得到了:

/(?=(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

4 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

~site\.com/u/(\S+)|(?<!\S)/u/(\S+)~

Live Demo

或者,您也可以在不捕获组的情况下执行此操作。 \K转义序列重置报告的匹配的起始点,不再包含任何以前消耗的字符。

~site\.com/u/\K\S+|(?<!\S)/u/\K\S+~

Live Demo

答案 1 :(得分:0)

没有任何捕获组,

(?<=site\.com\/u\/)\S+|(?<=^\/u\/)\S+

OR

site\.com\/u\/\K\S+|^\/u\/\K\S+

DEMO

答案 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...
     }