我正在解析MS Word文档,并使用Apache POI获取文本。
对于这样的段落:
最受欢迎的水果是苹果和香蕉(请参见下面的“ Common fruits”部分和“ Detailed botanic descriptions”部分)。
我得到一个看起来像这样的字符串:The most popular fruits were apples and bananas (see section ‘\u0013 HYPERLINK \\l "_Common_fruit_types\" \u0001\u0014Common fruits\u0015’ and subsection ‘\u0013 HYPERLINK \\l \"_Botanic_description\" \u0001\u0014Detailed botanic descriptions\u0015’ below).
也有使用“ PAGEREF”而不是“ HYPERLINK”的不同类型的标记或关键字,但似乎它们始终遵循\u0013 TAGWORD {String1} \u0001\u0014{String2}\u0015
模式
所以我想做的是删除除{String2}
以外的所有内容。到目前为止,我已经完成了:
RegEx模式\u0013(.*?)\u0014
-结果:{String2}\u0015
(已从我找不到的SO页面上获得了此功能)
RegEx模式\\[A-Za-z0-9]+
删除最终的\u0015
-什么也没发生。我要表达的是,删除单词(包含字符和数字),包括其后的反斜杠。还尝试了\\\\[A-Za-z0-9]+
,结果相同。
RegEx模式\u0013(.*?)u0015
删除整个链接结构
由于\u0013(.*?)\u0014(.*?)\u0015
所做的相同(全部删除),因此我尝试了\u0013(.*?)\u0014[^(.*?)]\u0015
,但是它什么也没有做。
备选:While循环
boolean textWasChanged = true;
while (textWasChanged) {
int idx1 = text.indexOf("\u0013");
int idx2 = text.indexOf("\u0014", idx1);
if (idx1 > -1 && idx2 > -1 && text.replace(text.substring(idx1, idx2+1), "").length() < text.length()) {
textWasChanged = true;
text = text.replace(text.substring(idx1, idx2+1), "");
} else {
textWasChanged = false;
}
}
text = text.replaceAll("\u0015", "");
手动清除有效,但我想知道是否可以将其简化为单线或其他形式。
或更具体:
如何编写仅保留
{String2}
的正则表达式模式?从正则表达式手册看来,这是可能的。我只是不能把头缠住它。我在步骤2和/或4中的错误在哪里?我只是否定了
(.*?)
部分,bc是我要保留的部分。但是我显然不明白正则表达式。 最佳答案
您可以使用以下Pattern
替换您的实体:
String raw = "The most popular fruits were apples and bananas "
+ "(see section ‘\\u0013 HYPERLINK \\l \"_Common_fruit_types\\\" "
+ "\\u0001\\u0014Common fruits\\u0015’ and subsection ‘\\u0013 HYPERLINK \\l"
+ "\\\"_Botanic_description\\\" "
+ "\\u0001\\u0014Detailed botanic descriptions\\u0015’ below).";
// test
System.out.printf("Raw string: %s%n%n", raw);
// | escaped back slash
// | | escaped unicode point
// | | | any 1+ character, reluctant
// | | | | escaped \ and unicode point
// | | | | | group 1: your goal
// | | | | | | escaped final \ + unicode point
Pattern p = Pattern.compile("\\\\u0013.+?\\\\u0014(.+?)\\\\u0015");
Matcher m = p.matcher(raw);
while (m.find()) {
System.out.printf("Found: %s%n", m.group(1));
}
System.out.println();
// actual replacement
System.out.printf(
"Replaced: %s%n",
raw.replaceAll("\\\\u0013.+?\\\\u0014(.+?)\\\\u0015", "$1")
);
输出(为清楚起见人工添加了换行符)
Raw string: The most popular fruits were apples and bananas (see section
‘\u0013 HYPERLINK \l "_Common_fruit_types\" \u0001\u0014Common fruits\u0015’
and subsection ‘\u0013 HYPERLINK \l\"_Botanic_description\"
\u0001\u0014Detailed botanic descriptions\u0015’ below).
Found: Common fruits
Found: Detailed botanic descriptions
Replaced: The most popular fruits were apples and bananas
(see section ‘Common fruits’ and subsection ‘Detailed botanic descriptions’ below).