开发者社区> 问答> 正文

正则表达式-Java中的多行

我有一个任意位字符串,例如

String multiline=`
This is my "test" case
with lines
\section{new section}
Another incorrect test"
\section{next section}
With some more "text"
\subsection{next section}
With some more "text1"
`

我使用LaTeX,我想用书中使用的引号代替-,和´´为此,我需要将以开头的每个组都用a代替引号,将a \glqq结束。\qrqq.?section

如果我尝试以下

String pattern1 = "(^\\\\.?section\\{.+\\})[\\s\\S]*(\\\"(.+)\\\")";
Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE);
Matcher m = p.matcher(testString);
System.out.println(p.matcher(testString).find()); //true

while (m.find()) {
  for (int i = 0; i < 4; i++) {
    System.out.println("Index: " + i);
    System.out.println(m.group(i).replaceAll("\"([\\w]+)\"", "\u00AB$1\u00BB"));
  }
}

结果是在控制台上

true
Index: 0
\section{new section}
Another incorrect test"
\section{next section}
With some more «text1»
Index: 1
\section{new section}
Index: 2
«text1»
Index: 3
text1

我当前方法的一些问题:

  1. "text"找不到第一个有效的匹配()。我想这与多义线和的错误分组有关\section{。报价的分组应限制在\section以?.section- 结尾的组中-如何使此正确?
  2. 即使正确找到了文本-如何获得带有替换的完整字符串?

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 19:55:54 749 0
1 条回答
写回答
取消 提交回答
  • 您可以匹配字符串section的下一个section或结尾与下一个或结尾之间的所有文本,并将其中的所有"..."字符串替换为«...。

    这是Java代码段(请参阅demo):

    String s = "This is my \"test\" case\nwith lines\n\\section{new section}\nAnother incorrect test\"\n\\section{next section}\nWith some more \"text\"\n\\subsection{next section}\nWith some more \"text1\"";
    StringBuffer result = new StringBuffer();
    Matcher m = Pattern.compile("(?s)section.*?(?=section|$)").matcher(s);
    while (m.find()) {
        String out = m.group(0).replaceAll("\"([^\"]*)\"", "«$1»");
        m.appendReplacement(result, Matcher.quoteReplacement(out));
    }
    m.appendTail(result);
    System.out.println(result.toString());
    

    输出:

    This is my "test" case
    with lines
    \section{new section}
    Another incorrect test"
    \section{next section}
    With some more «text»
    \subsection{next section}
    With some more «text1»
    

    该模式表示:

    • (?s)- Pattern.DOTALL嵌入式标志选项
    • section- section子串
    • .*? -任何0个以上的字符,尽可能少
    • (?=section|$)-正向超前查询,要求section子字符串或字符串结尾立即显示在当前位置的右侧。 回答来源:Stack Overflow
    2020-03-22 19:57:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载