Java正则表达式子串提取模式

时间:2012-09-28 10:05:49

标签: java regex pattern-matching expression

我有这样的文字:

<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>(.*)";

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

4 个答案:

答案 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.substringString.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);
    }
  }