我需要根据新行从扫描仪中读取内容,前提是它位于双引号之外。
Input : "Content1 \r\n block" \r\n Contentn2 \r\n New conenet " \r\n Conetent 3"
Expected Output :
“内容1 块”
内容n2
新锥网” 内容 3" ``
我已经尝试过
String content = "\"Content1 \r\n block\" \r\n Contentn2 \r\n New conenet \" \r\n Conetent 3\"";
Scanner fileScanner = new Scanner(content);
String regex = "[^\"\r\n]+(?:\"[^\"]*\"[^\"\r\n]+)*";
while(fileScanner.hasNext())
{
String rec = fileScanner.findWithinHorizon(regex,0);
Sysyetem.out.println(rec);
}
但它没有按上面预期的那样工作,也检查了其他但没有一个适用于此
/(?<=^[^"]*(?:"[^"]*"[^"]*)*)\r?\n/
这在 Javascript 中只适用于外部
,但在尝试用作 fileScanner.useDelimter() 时无法在 java 中工作并抛出错误
Look-behind group does not have obvuios maximum length
请推荐
您可以做的是使用匹配字符串或的正则表达式 您的
\r\n
,位于两个不同的命名捕获组中。
这可以通过使用 (?: | )
来完成“or”
条件(不捕获它),然后使用 (?<group_name> )
创建命名的捕获组。
要匹配双引号字符串,可以是这样的:
"(?:\\"|[^"])*"
解释:
"
与开头的双引号匹配。\\"
匹配反斜杠后跟双引号。这是
因为双引号通常用反斜杠转义。[^"]
将匹配任何不是双引号的字符。(?: | )
是一个非捕获群,有两种可能性。
后面加*
表示可以重复0次或N次。完整的正则表达式,带有 x 标志用于 ex 倾向语法 可以让您在正则表达式中添加注释和空格,以便更好 阅读。
PCRE 语法 (PHP),带有 g 标志 g叶/多个:
/
(?:
# String with possible quote inside.
(?<string>"(?:\\"|[^"])*")
| # or
# \r\n, but outside a string (as it's tested after the string).
(?<newline>\\r\\n)
)
/gx
在 regex101 上针对 Java 进行测试:https://regex101.com/r/c0LZD2/1
您必须循环匹配并测试名为的组是否 newline(或索引2的组)是否被填充。如果已满 然后用你真正的换行符替换它。
我不是 Java 开发人员。我使用 PHP 或 JavaScript 并执行此操作 使用替换回调,如下所示:
// Same regular expression, but here without named capturing groups.
//
// g1 = string g2 = newline & spaces
// /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\ /¯¯¯¯¯¯¯¯¯¯¯¯\
const regex = /(?:("(?:\\"|[^"])*")|(\s*\\r\\n\s*))/g;
const input = `Input : "Content1 \\r\\n block" \\r\\n Contentn2 \\r\\n New conenet " \\r\\n Conetent 3"
Input : "A string can contain \\"quotes\\"" \\r\\n Something else "\\" \\r\\n"`;
console.log(
input.replace(regex, function(fullMatch, quotedString, newLine) {
if (newLine) {
return "\n";
} else {
return fullMatch;
}
})
);