扫描仪定界符仅在java中的双引号之外取新行

问题描述 投票:0回答:1

我需要根据新行从扫描仪中读取内容,前提是它位于双引号之外。

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

请推荐

java regex java.util.scanner
1个回答
0
投票

您可以做的是使用匹配字符串或的正则表达式 您的

\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 开发人员。我使用 PHPJavaScript 并执行此操作 使用替换回调,如下所示:

// 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;
    }
  })
);

© www.soinside.com 2019 - 2024. All rights reserved.