我一直在与Java Regex挣扎我希望我的正则是2个特定字符,然后将任何与第二组匹配的东西
String regex = "(^[a-zA-Z | _])([a-zA-Z0-9\-_^\s]*)";
Pattern pattern = Pattern.compile(regex);
String s1 = "hello world";
String s2 = "_Sau90-jds";
String s3 = "5_idsjd";
String s4 = "A-next";
ArrayList<String> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
for (String string : list) {
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
我想要的结果:
_Sau90-jds
A-suivant
但是我一直有
hello world
_Sau90-jds
A-suivant
我的字符串必须从字母a-za-z或" _"开始,然后只能包含字母,数字,下划线和连字符,这意味着没有白色空间。
我尝试了String regex = "(^[a-zA-Z | _])([a-zA-Z0-9\-_\S]*)"
和String regex = "(^[a-zA-Z | _])([a-zA-Z0-9\-_]*)"
,但他们俩都给了我
hello
_Sau90-jds
A-next
简介
您的正则有几件事会导致它无法正常工作。
-
[a-zA-Z | _]
说要匹配集合中存在的任何字符,因此,这与a-zA-Z |_
(字面意思)匹配。因此,您实际上在|
字符上包括匹配项以及Space字符。
-
a-zA-Z0-9-_^s
说要匹配集合中存在的任何字符,因此,这与^
(字面意思)匹配。因此,实际上,您实际上包括$
字符以及任何Whitespace字符的匹配项。 - 另外,不添加
hello
(线路结束),您将与您在结果中看到的^
匹配。
代码
请参阅此处使用的正则
^[^Wd][w-]*$
基本上与
相同^[a-zA-Z_][a-zA-Z0-9_-]*$
结果
输入
hello world
_Sau90-jds
5_idsjd
A-next
输出
_Sau90-jds
A-next
说明
-
[^Wd]
在线开始时断言位置 -
[w-]*
匹配除数字以外的任何单词字符 -
-
匹配任何单词字符或连字符$
任何次数 - CC_16在行末尾断言位置
让我们按照您的要求:
我的字符串必须从字母A-ZA-Z或" _" 和开始,然后它只能包含字母,数字,下端和连字符,这意味着没有白色空间。
并逐步构造正则态度。
-
以字母A-ZA-Z或" _"
开始^[a-zA-Z_]
-
然后它只能包含字母,数字,下划线和连字符
[a-zA-Zd_-]+
Please try this :
public class Regex {
public static void main(String[] args) {
String regex = "^[a-zA-Z_][a-zA-Z0-9_-]*$";
String regexPhase2 = "(^[a-z])([a-zA-Z0-9\-_^\s]*)";
Pattern pattern = Pattern.compile(regex);
String s1 = "hello world";
String s2 = "_Sau90-jds";
String s3 = "5_idsjd";
String s4 = "A-next";
ArrayList<String> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
for (String string : list) {
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
}