我有这样的文字:
<blockquote>1. тест1; тест2; </blockquote>
<blockquote>2. тест1; тест2; </blockquote>
<blockquote>1) тест1; тест2; </blockquote>
<blockquote>2) тест1; тест2; </blockquote>
<blockquote>1. 1) тест1; тест2; </blockquote>
<blockquote>1) 1. тест1; тест2; </blockquote>
<blockquote>1. тест </blockquote>
你可以给我表达,使用我可以提取тест1; тест2;在任何这个字符串中变量? тест1; тест2; - 是cyrilic。所以对于提取物тест我需要使用([\ p {IsCyrillic}] *)表达。
String pattern = "(.*)<blockquote>1. ([\\p{IsCyrillic}]*) </blockquote>(.*)";
仅适用于第一个变体。这个变体的表达方式是什么? (或者你可以给我每个字符串变体的特定表达式吗?
答案 0 :(得分:2)
对于原始帖子中的所有字符串: -
String pattern = "(.*)<blockquote>[\\d[\\.\\)]\\s]+([[\\p{IsCyrillic}][\\d\\;\\s]+]+) </blockquote>(.*)";
对于您在下面给出的新要求字符串,请使用以下模式: -
String str = "<blockquote>1. тест </blockquote><blockquote>2. 1) ветка; метрика </blockquote>";
String p = "[(.*)<blockquote>[\\d[\\.\\)]\\s]+([[\\p{IsCyrillic}][\\d\\;\\s]+]+) </blockquote>(.*)]+";
好的,要匹配并返回上面字符串中的所有三个тест, ветка; метрика
,这里是代码: -
String str = "<blockquote>1. тест </blockquote><blockquote>2. 1) ветка; метрика </blockquote>";
Pattern pattern1 = Pattern.compile("(тест)|(ветка;)|(метрика)");
Matcher matcher = pattern1.matcher(str);
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
System.out.println(matcher.group());
}
但是,由于您只是匹配fixed
字符串,因此您不需要regex
。您可以使用常规的String
类方法。使用String.substring
,String.indexOf
方法查找字符串。 Regex
的实际功率是在一个模式上匹配几个字符串。
答案 1 :(得分:0)
这取决于您的确切要求。这是一个相当简单的修改,假设开头的编号可以是空格,右括号,点和数字的任意组合。
String pattern =
"(.*)<blockquote>[\\s\\.\\)\\d]+([\\p{IsCyrillic}\\;\\d\\s]*)</blockquote>(.*)";
更新:也进行了编辑,以便中间部分匹配分号,数字和空格。
更新2:在阅读评论中的讨论后,我不再确定需要什么,但这样做与编号后的整个中间部分相匹配。匹配的部分可以是西里尔字符,分号,数字和空格的任意组合(只要它不以数字开头)。
答案 2 :(得分:0)
如果您只想检索тест1
和тест2
。然后,您可以使用String.substring()
和String.indexOf()
函数执行字符串搜索。在这种情况下不需要正则表达式。
但是如果标签可以包含不同的字符串,那么您可以使用以下正则表达式。
(?<= ).*?(?=(;| ))
此正则表达式将在blockquote标记内单独选择字符串。
<blockquote>1. тест1; тест2; </blockquote>
<blockquote>2. тест1; тест2; </blockquote>
<blockquote>1) тест1; тест2; </blockquote>
<blockquote>2) тест1; тест2; </blockquote>
<blockquote>1. 1) тест1; тест2; </blockquote>
<blockquote>1) 1. тест1; тест2; </blockquote>
<blockquote>1. тест </blockquote>
这将选择
тест1 тест2
тест1 тест2
тест1 тест2
тест1 тест2
1) тест1 тест2
1. тест1 тест2
тест
分别为所有标签。
如果您想从第5和第6个代码中删除1)
和1.
,请相应地格式化字符串。
但是如果你在同一行中有所有标签,那么它也会选择那些标签。您可以通过检查匹配的字符串是否以<
开头来过滤掉它们。
答案 3 :(得分:-2)
这里的模式看起来很不错,应该可行。但是,有时我发现这样做的步骤更容易,例如:
public static void main(String[] args){
String[] testStrings = { "<blockquote>1. тест1; тест2; </blockquote>",
"<blockquote>2. тест1; тест2; </blockquote>",
"<blockquote>1) тест1; тест2; </blockquote>",
"<blockquote>2) тест1; тест2; </blockquote>",
"<blockquote>1. 1) тест1; тест2; </blockquote>",
"<blockquote>1) 1. тест1; тест2; </blockquote>" };
for (String testString : testStrings){
String result = testString
.replace("<blockquote>", "")
.replace("</blockquote>", "")
.replaceAll("\\d\\.|\\d\\)", "")
.trim();
System.out.println(result);
}
}