我有一个字符串,数据用逗号分隔,如下所示:
$d4kjvdf,78953626,10.0,103007,0,132103.8945F,
我尝试了以下正则表达式,但它与我想要的字符串不匹配:
[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,[a-zA-Z0-9]+\\,
答案 0 :(得分:2)
数据字符串开头的$
与正则表达式不匹配。将第一个字符类更改为[$a-zA-Z0-9]
。并且一些逗号分隔值包含一个文字点。 [$.a-zA-Z0-9]
将涵盖这两种情况。此外,通过将^
和$
分别添加到正则表达式的开头和结尾,将正则表达式锚定在开头和结尾可能是个好主意。对于完整的正则表达式如何:
^[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,[$.a-zA-Z0-9]+\\,$
您说逗号的数量是您的主要匹配条件。如果应该有6个逗号,这将有效:
^([^,]+,){6}$
这意味着:匹配至少1个不是逗号的字符,后跟逗号。并连续6次执行上述比赛。注意:您的数据必须以尾随逗号结尾,与您的示例数据一致。
答案 1 :(得分:0)
那么你的正则表达式肯定是无法表达的 - 有明显的字符(比如$
和.
)你的表达式不匹配,你不需要\\
逃脱,
秒。让我们先描述一下我们的要求,你似乎在说一个有效的字符串被定义为:
由6个逗号组成的字符串,每个逗号前有一个或多个字符
我们可以用以下模式表示:
(?:[^,]+,){6}
这表示匹配一个或多个非逗号,后跟逗号 - [^,]+,
- 六次 - {6}
。 (?:...)
表示法是non-capturing group,它让我们说整个子表达式匹配六次,没有它,{6}
只适用于前一个字符。
或者,我们可以使用普通的捕获组让我们选择匹配字符串的每个部分:
([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),?
现在我们不仅可以匹配字符串,还可以同时提取其内容,例如:
String str = "$d4kjvdf,78953626,10.0,103007,0,132103.8945F,";
Pattern regex = Pattern.compile(
"([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),?");
Matcher m = regex.matcher(str);
if(m.matches()) {
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
}
打印:
$d4kjvdf 78953626 10.0 103007 0 132103.8945F