我需要匹配字符串,如下所示:
;
-
,则仅匹配-
除-
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
答案 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)
答案 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.
}