需要正则表达式用文本替换RTF控制字。 Java的

时间:2017-03-28 13:39:01

标签: java regex

我有一个String,其中标签可以出现在像^...^这样的插入符号sysmbol中。我找到了一个正则表达式,可以在\\^.*?\\^之类的字符串中找到标签。现在找到标签后,我的标签可以包含RTf控制字。它并不总是,但在某些情况下它可以。以下是此类标记^L\\hich\\af39\\dbch\\af31505\\loch\\f39 OT-CITY^的示例。现在我想替换此标签中的RTF控制字。为此,我尝试制作一个可以以\开头的正则表达式,可以在斜杠后包含字母或数字,也可以包含空格。并将其替换为空""。这样我就剩下LOT-CITY了。我该怎么做。我尝试了以下

String tagRegex = "\\^.*?\\^";
Pattern tagRegexPattern = Pattern.compile(tagRegex, Pattern.MULTILINE);
Matcher tagRegexPatternMatcher = tagRegexPattern.matcher(input);
while(tagRegexPatternMatcher.find()) {   // work
    String tag = tagRegexPatternMatcher.group();
    String controlWordRegex = "\\b\\[a-zA-Z]+(-?[0-9]+)? ? \\b";
    Pattern controlWordRegexPattern = Pattern.compile(controlWordRegex, Pattern.MULTILINE);
    Matcher controlWordRegexPatternMatcher = controlWordRegexPattern.matcher(tag);
    while (controlWordRegexPatternMatcher.find()) {  // didn't work
        String matchedText = controlWordRegexPatternMatcher.group();
    }
}

以下是我尝试的输入

String input = "{\\rtlch\\fcs1 \\af39\\afs20 \\ltrch\\fcs0 \\fs20\\insrsid10175635\\charrsid8585274 \\hich\\af39\\dbch\\af31505\\loch\\f39 Build Job City:\\par \\hich\\af39\\dbch\\af31505\\loch\\f39 ^L\\hich\\af39\\dbch\\af31505\\loch\\f39 OT-CITY^}";

我也尝试了以下\\b\\[a-zA-Z0-9]+ \\B。还有边界和无边界匹配。但没有得到它的工作。我怎样才能做出这样的正则表达式?

由于

1 个答案:

答案 0 :(得分:0)

以下是解决问题的方法:

String input = "{\\rtlch\\fcs1 \\af39\\afs20 \\ltrch\\fcs0 \\fs20\\insrsid10175635\\charrsid8585274 \\hich\\af39\\dbch\\af31505\\loch\\f39 Build Job City:\\par \\hich\\af39\\dbch\\af31505\\loch\\f39 ^L\\hich\\af39\\dbch\\af31505\\loch\\f39 OT-CITY^}";
String tagRegex = "\\^(.*?)\\^";
Pattern tagRegexPattern = Pattern.compile(tagRegex, Pattern.DOTALL);
Matcher tagRegexPatternMatcher = tagRegexPattern.matcher(input);
while(tagRegexPatternMatcher.find()) {   // work
    String tag = tagRegexPatternMatcher.group(1);
    String controlWordRegex = "\\b(?:\\\\[a-zA-Z]+(-?[0-9]+)? ?)+ \\b";
    System.out.println(tag.replaceAll(controlWordRegex, ""));
}

请参阅Java demo

首先,我在初始正则表达式中添加了一个捕获组,以便在^个符号之间抓取文本。

然后,第二个正则表达式匹配

  • \\b - 一个单词边界(必须有字符串的开头或之前的单词char)
  • (?:\\\\[a-zA-Z]+(-?[0-9]+)? ?)+ - 非捕获组((?:....),仅用于将模式分组以匹配它们作为序列)匹配1个或多个序列:
    • \\\\ - \
    • [a-zA-Z]+ - 一个或多个字母
    • (-?[0-9]+)? - 可选-的可选序列,然后是1+位数
    • ? - 可选空格(为了安全而替换为\\s
  • \\b - 一个主要的单词边界(必须有字符串的结尾或后面的单词char)

此正则表达式在.replaceAll方法中用于从使用第一个正则表达式获得的匹配项中删除RTF代码。