Java 具有固定开始和重复块的字符串的正则表达式
Java regex for string with fixed start and repeated blocks
考虑一行文本,例如
"ab,""c"",""d"",""e"",""""
上面的行有一个固定的开始 "ab
然后它重复像
这样的块
,""<non-quote(s)>""
(即,逗号,后跟 2 个双引号,后跟 0 个或多个非引号,后跟 2 个引号),可能为空块(即 4 个连续引号 """"
)。
像
这样的正则表达式
- (?:,"+([^",]*)"+)
将匹配所有块(即从第一个逗号开始的所有内容,包括在内),但忽略固定开头。
使用 "or" (|
) 子句,例如
- (?:"([^,]+)|,"+([^",]*)"+)
有效,但有 2 个组,其中 #1 是 matcher.find()
第一轮的固定开始,其余的 null
,而 #2 是 null
在第一次调用中并在所有其他调用中正确填充。
是否有一个有效的 Java
正则表达式可以生成单个组,对于 matcher.find()
returns 的连续调用,首先是固定的开始,然后是每个重复块?
我认为这就是您正在寻找的模式:
"{1,2}([^",]*)(?:"")?(?:,|$)
或作为 Java 字符串:
\"{1,2}([^\",]*)(?:\"\")?(?:,|$)
然后您在 组 1(唯一捕获的组)中获得所需的值。
请记住,此正则表达式仅对拆分字符串有用,对验证字符串无效。此外,它不支持带有 [ , ] 或 [ " ] 的值。
这里有一个用法示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class MatcherTest {
private static String text = "\"ab,\"\"c\"\",\"\"d\"\",\"\"e\"\",\"\"\"\"";
private static String patternString = "\"{1,2}([^\",]*)(?:\"\")?(?:,|$)";
public static void main(final String[] args) throws java.lang.Exception {
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("'" + matcher.group(1) + "'");
}
}
}
考虑一行文本,例如
"ab,""c"",""d"",""e"",""""
上面的行有一个固定的开始 "ab
然后它重复像
,""<non-quote(s)>""
(即,逗号,后跟 2 个双引号,后跟 0 个或多个非引号,后跟 2 个引号),可能为空块(即 4 个连续引号 """"
)。
像
这样的正则表达式- (?:,"+([^",]*)"+)
将匹配所有块(即从第一个逗号开始的所有内容,包括在内),但忽略固定开头。
使用 "or" (|
) 子句,例如
- (?:"([^,]+)|,"+([^",]*)"+)
有效,但有 2 个组,其中 #1 是 matcher.find()
第一轮的固定开始,其余的 null
,而 #2 是 null
在第一次调用中并在所有其他调用中正确填充。
是否有一个有效的 Java
正则表达式可以生成单个组,对于 matcher.find()
returns 的连续调用,首先是固定的开始,然后是每个重复块?
我认为这就是您正在寻找的模式:
"{1,2}([^",]*)(?:"")?(?:,|$)
或作为 Java 字符串:
\"{1,2}([^\",]*)(?:\"\")?(?:,|$)
然后您在 组 1(唯一捕获的组)中获得所需的值。
请记住,此正则表达式仅对拆分字符串有用,对验证字符串无效。此外,它不支持带有 [ , ] 或 [ " ] 的值。
这里有一个用法示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class MatcherTest {
private static String text = "\"ab,\"\"c\"\",\"\"d\"\",\"\"e\"\",\"\"\"\"";
private static String patternString = "\"{1,2}([^\",]*)(?:\"\")?(?:,|$)";
public static void main(final String[] args) throws java.lang.Exception {
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("'" + matcher.group(1) + "'");
}
}
}