Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要正则表达式将RTF控制字替换为in-text。JAVA_Java_Regex - Fatal编程技术网

需要正则表达式将RTF控制字替换为in-text。JAVA

需要正则表达式将RTF控制字替换为in-text。JAVA,java,regex,Java,Regex,我有一个字符串,其中标记可以出现在插入符号sysmbol中,如^…^。我发现了一个正则表达式,它可以在字符串中找到标记,如\\^.*?\\^。现在,在找到标记后,我的标记可以包含RTf控制字。不总是这样,但在某些情况下它可以。以下是此类标记的示例^L\\hich\\af39\\dbch\\af31505\\loch\\f39 OT-CITY^。现在我想替换这个标签中的RTF控制字。为此,我尝试创建一个正则表达式,它可以以\开头,可以在斜杠后包含字母或数字,或者两者都包含,并以空格结尾。并将其替换

我有一个字符串,其中标记可以出现在插入符号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
。也可以使用边界匹配和非边界匹配。但是没有成功。我怎样才能生成这样的正则表达式


谢谢

以下是解决此问题的方法:

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, ""));
}

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

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

  • \\b
    -单词边界(之前必须有字符串开头或单词字符)
  • (?:\\\[a-zA-Z]+(?[0-9]+)+
    -一个非捕获组(
    (?:…)
    ,仅用于将模式分组以将其作为一个序列进行匹配),匹配一个或多个以下序列:
    • \\\
      -a
      \
    • [a-zA-Z]+
      -1个或多个字母
    • ([0-9]+)?
      -可选的
      -
      和1+位的可选序列
    • -可选空间(为安全起见,替换为
      \\s
  • \\b
    -前导单词边界(必须有字符串结尾或后面的单词字符)

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

以下是解决此问题的方法:

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, ""));
}

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

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

  • \\b
    -单词边界(之前必须有字符串开头或单词字符)
  • (?:\\\[a-zA-Z]+(?[0-9]+)+
    -一个非捕获组(
    (?:…)
    ,仅用于将模式分组以将其作为一个序列进行匹配),匹配一个或多个以下序列:
    • \\\
      -a
      \
    • [a-zA-Z]+
      -1个或多个字母
    • ([0-9]+)?
      -可选的
      -
      和1+位的可选序列
    • -可选空间(为安全起见,替换为
      \\s
  • \\b
    -前导单词边界(必须有字符串结尾或后面的单词字符)

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

请查看。它起作用了。令人惊叹的。把你的答案贴出来,这样我就可以接受了。但让我也明白。你从单词边界开始。然后你组成了一个小组。在您使用的组内
?:\\\`。这是什么意思?然后你说a-z a-z可以出现一次或多次。然后你组成了一个小组。在这个组中,你说可以包含
-`一次,也可以不包含。可以包含
0-9
一次或多次。组关闭,此组可以显示一次或多次。有一个空间和边界端点。我理解正确吗?
(?:…)
是一个非捕获组,不在内存中保留子匹配,它只用于对模式进行分组,以便将它们量化为一个假设或组备选方案。请注意,要匹配
\
,需要在字符串文本regex中使用4个反斜杠。请看一看。它成功了。令人惊叹的。把你的答案贴出来,这样我就可以接受了。但让我也明白。你从单词边界开始。然后你组成了一个小组。在您使用的组内
?:\\\`。这是什么意思?然后你说a-z a-z可以出现一次或多次。然后你组成了一个小组。在这个组中,你说可以包含
-`一次,也可以不包含。可以包含
0-9
一次或多次。组关闭,此组可以显示一次或多次。有一个空间和边界端点。我理解正确吗?
(?:…)
是一个非捕获组,不在内存中保留子匹配,它只用于对模式进行分组,以便将它们量化为一个假设或组备选方案。请注意,要匹配
\
,需要在字符串文本regex中使用4个反斜杠。