如果字符出现,正则表达式匹配一个字符

时间:2015-09-16 11:02:08

标签: java regex

我需要匹配字符串,如下所示:

  1. 将所有内容匹配到;
  2. 如果发生-,则仅匹配--
  3. 以外的abc;

    例如:

    • abc应该返回abc-xyz;
    • abc应该返回Pattern.compile("^(?<string>.*?);$");

    .*?

    使用上面我可以实现一半。但不知道如何改变这种模式以达到第二个要求。如何更改-以使其在public static final Pattern findString = Pattern.compile("^(?<string>.*?);$"); if(findString.find()) { return findString.group("string"); //cant change anything here. }

    的最后发生时停止

    我对正则表达式并不擅长。任何帮助都会很棒。

    修改

    我需要将其捕获为群组。我无法改变它,因为有许多其他模式可以匹配和捕获。它是我发布的唯一部分。

    代码如下所示。

    > a = true 
    > a.valid_passowrd?
    > undefined method `valid_password?' for true:TrueClass
    

4 个答案:

答案 0 :(得分:5)

只需使用否定的char类。

=IFERROR(IF(INT(RIGHT(A5;2))=VLOOKUP(INT(LEFT(A5;5));'Path[file.xls]
    Sheet1'!$S$3:$AA$200;2;FALSE);VLOOKUP(INT(LEFT(A5;5));'path[file.xls]
    Sheet1'!$S$3:$AA$200;3;FALSE);VLOOKUP(INT(LEFT(A5;5));'path[file.xls]
    Sheet1'!$S$3:$AA$200;5;FALSE));"")

^[^-;]*

这会匹配开头的任何字符,但不会匹配Pattern p = Pattern.compile("^[^-;]*"); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group()); } -的任何字符,零次或多次。

答案 1 :(得分:0)

这应该可以满足您的需求:

[^-;]*

它匹配非-;的字符。

Tipp:如果您不确定正则表达式,那么有很好的在线解决方案可以测试您的输入,例如: https://regex101.com/

答案 2 :(得分:0)

<强>更新

我发现代码中存在问题,因为您尝试访问.group对象中的Pattern,而您需要使用.group Matcher方法对象:

public static String GetTheGroup(String str) {
    Pattern findString = Pattern.compile("(?s)^(?<string>.*?)[;-]");
    Matcher matcher = findString.matcher(str);
    if (matcher.find())
    {
        return matcher.group("string"); //you have to change something here.
    }
    else
        return "";
}

并将其命名为

System.out.println(GetTheGroup("abc-xyz;"));

请参阅IDEONE demo

OLD ANSWER

您的^(?<string>.*?);$正则表达式仅匹配从开头到第一个;的换行符之外的0个或更多字符,这是字符串中的最后一个字符。我想这不是你所期望的。

您应该了解有关在正则表达式中使用character classes的详情,因为您可以匹配使用[...]定义的指定字符集中的1个符号。

您可以使用仅String.split获取第一个元素并使用[;-];字面上的-正则结构来实现此目的:

String res = "abc-xyz;".split("[;-]")[0];
System.out.println(res);

或者replaceAll使用(?s)[;-].*$正则表达式(与第一个;-匹配,然后匹配到字符串末尾的任何内容:

res = "abc-xyz;".replaceAll("(?s)[;-].*$", "");
System.out.println(res);

请参阅IDEONE demo

答案 3 :(得分:0)

我找到了解决方案而没有删除分组。

  • (?<string>.*?)匹配下一个分组模式的所有内容
  • (?:-.*?)?后跟非分组模式以-开头,为零或一次。
  • ;结束字符。

所以把所有人放在一起:

    public static final Pattern findString = Pattern.compile("^(?<string>.*?)(?:-.*?)?;$");
    if(findString.find())
    {
       return findString.group("string"); //cant change anything here.
    }