任何人都可以帮助我使用一些正则表达式。
我想将以下字符串拆分为数字,字符串编号
"810LN15"
1方法需要返回810,另一个需要LN,另一个应返回15.
唯一真正的解决方案是使用正则表达式,因为数字的长度会增长
我可以用什么正则表达式来容纳这个?
答案 0 :(得分:17)
String.split
不会给你想要的结果,我猜这将是“810”,“LN”,“15”,因为它必须寻找一个分裂的标记,并将剥离令牌。
尝试Pattern
和Matcher
,使用此正则表达式:(\d+)|([a-zA-Z]+)
,它将匹配任何数字和字母序列,并获得不同的数字/文本组(即“AA810LN15QQ12345”将导致在“AA”,“810”,“LN”,“15”,“QQ”和“12345”组中。
示例:
Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)");
Matcher m = p.matcher("810LN15");
List<String> tokens = new LinkedList<String>();
while(m.find())
{
String token = m.group( 1 ); //group 0 is always the entire match
tokens.add(token);
}
//now iterate through 'tokens' and check whether you have a number or text
答案 1 :(得分:10)
在Java中,与大多数正则表达式一样(Python是一个值得注意的例外),split()
正则表达式在找到匹配项时不需要使用任何字符。在这里,我使用了前瞻和后视来匹配任何有一个数字位置和另一个数字的位置:
String source = "810LN15";
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");
System.out.println(Arrays.toString(parts));
输出:
[810, LN, 15]
答案 2 :(得分:7)
(\\d+)([a-zA-Z]+)(\\d+)
应该做到这一点。第一个捕获组将是第一个数字,第二个捕获组将是中间的字母,第三个捕获组将是第二个数字。双反斜杠适用于java。
答案 3 :(得分:0)
这可以为您提供您正在寻找的确切内容
Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))");
Matcher m = p.matcher("810LN15");
List<Object> tokens = new LinkedList<Object>();
while(m.find())
{
String token = m.group( 1 );
tokens.add(token);
}
System.out.println(tokens);