需要正则表达式将RTF控制字替换为in-text。JAVA
我有一个字符串,其中标记可以出现在插入符号sysmbol中,如需要正则表达式将RTF控制字替换为in-text。JAVA,java,regex,Java,Regex,我有一个字符串,其中标记可以出现在插入符号sysmbol中,如^…^。我发现了一个正则表达式,它可以在字符串中找到标记,如\\^.*?\\^。现在,在找到标记后,我的标记可以包含RTf控制字。不总是这样,但在某些情况下它可以。以下是此类标记的示例^L\\hich\\af39\\dbch\\af31505\\loch\\f39 OT-CITY^。现在我想替换这个标签中的RTF控制字。为此,我尝试创建一个正则表达式,它可以以\开头,可以在斜杠后包含字母或数字,或者两者都包含,并以空格结尾。并将其替换
^…^
。我发现了一个正则表达式,它可以在字符串中找到标记,如\\^.*?\\^
。现在,在找到标记后,我的标记可以包含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\\\
\
-1个或多个字母[a-zA-Z]+
-可选的([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\\\
\
-1个或多个字母[a-zA-Z]+
-可选的([0-9]+)?
和1+位的可选序列-
-可选空间(为安全起见,替换为?
)\\s
-前导单词边界(必须有字符串结尾或后面的单词字符)\\b
此正则表达式在
.replaceAll
方法中使用,用于从使用第一个正则表达式获得的匹配中删除RTF代码。请查看。它起作用了。令人惊叹的。把你的答案贴出来,这样我就可以接受了。但让我也明白。你从单词边界开始。然后你组成了一个小组。在您使用的组内?:\\\`。这是什么意思?然后你说a-z a-z可以出现一次或多次。然后你组成了一个小组。在这个组中,你说可以包含
-`一次,也可以不包含。可以包含0-9
一次或多次。组关闭,此组可以显示一次或多次。有一个空间和边界端点。我理解正确吗?(?:…)
是一个非捕获组,不在内存中保留子匹配,它只用于对模式进行分组,以便将它们量化为一个假设或组备选方案。请注意,要匹配\
,需要在字符串文本regex中使用4个反斜杠。请看一看。它成功了。令人惊叹的。把你的答案贴出来,这样我就可以接受了。但让我也明白。你从单词边界开始。然后你组成了一个小组。在您使用的组内?:\\\`。这是什么意思?然后你说a-z a-z可以出现一次或多次。然后你组成了一个小组。在这个组中,你说可以包含
-`一次,也可以不包含。可以包含0-9
一次或多次。组关闭,此组可以显示一次或多次。有一个空间和边界端点。我理解正确吗?(?:…)
是一个非捕获组,不在内存中保留子匹配,它只用于对模式进行分组,以便将它们量化为一个假设或组备选方案。请注意,要匹配\
,需要在字符串文本regex中使用4个反斜杠。