0

我有这段文字:

<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; - 是西里尔字母。所以对于提取 тест 我需要使用 ([\p{IsCyrillic}]*) 表达式。

String pattern = "(.*)<blockquote>1. ([\\p{IsCyrillic}]*) </blockquote>(.*)";

仅适用于第一个变体。这种变体的表达方式是什么?(或者你可以给我每个字符串变体的特定表达吗?

4

4 回答 4

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在于在一个模式上匹配多个字符串。

于 2012-09-28T10:16:41.470 回答
0

这取决于您的确切要求。这是一个相当简单的修改,假设开头的编号可以是空格、右括号、点和数字的任意组合。

String pattern = 
 "(.*)<blockquote>[\\s\\.\\)\\d]+([\\p{IsCyrillic}\\;\\d\\s]*)</blockquote>(.*)";

更新:还进行了编辑,使中间部分匹配分号、数字和空格。

更新 2:在阅读了评论中的讨论后,我不再确定需要什么,但这样做是匹配编号后的整个中间部分。匹配的部分可以是西里尔字符、分号、数字和空格的任意组合(只要它不以数字开头)。

于 2012-09-28T10:14:45.960 回答
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.,请相应地格式化您的字符串。

但是,如果您在同一行中有所有标签,那么它也会选择这些标签。您可以通过检查匹配的字符串是否以 开头来过滤掉它们<

于 2012-10-30T08:11:25.857 回答
-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);
    }
  }
于 2012-09-28T10:18:49.090 回答