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

Java正则表达式子字符串提取模式,java,regex,pattern-matching,expression,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

我有以下案文:

<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。тест1; тест2; 
2.тест1; тест2; 
1) тест1; тест2; 
2) тест1; тест2; 
1.1) тест1; тест2; 
1) 1. тест1; тест2; 
1.тест 
你能不能给我一个表达式,用它我可以提取出1;тест2; 要在任何字符串中使用变量?тест1; тест2; - 是西里尔语。因此,对于提取,我需要使用([\p{iscrylical}]*)表达式

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

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

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

String pattern = 
 "(.*)<blockquote>[\\s\\.\\)\\d]+([\\p{IsCyrillic}\\;\\d\\s]*)</blockquote>(.*)";
字符串模式=
“(.**)[\\s\\.\\\\\d]+([\\p{iscyrical}\\\;\\d\\s]*)(.”;
更新:还进行了编辑,以便中间部分匹配分号、数字和空格


更新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
class方法。使用
String.substring
String.indexOf
方法查找字符串。
Regex
的真正功能在于在一个模式上匹配多个字符串。

这里的模式看起来很好,应该可以工作。然而,有时我发现一步一步地做这样的事情更容易,例如:

  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);
    }
  }
publicstaticvoidmain(字符串[]args){
String[]testStrings={“1.1.1;2;”,
"2. тест1; тест2; ",
"1) тест1; тест2; ",
"2) тест1; тест2; ",
"1. 1) тест1; тест2; ",
"1) 1. тест1; тест2; " };
for(字符串testString:testStrings){
字符串结果=测试字符串
.替换(“,”)
.替换(“,”)
.replaceAll(“\\d\\.\\d\\)”,“”)
.trim();
系统输出打印项次(结果);
}
}

如果您只想检索
1
2
。然后,您可以使用
string.substring()
string.indexOf()
函数执行字符串搜索。在这种情况下,不需要正则表达式

但是如果标记可以包含不同的字符串,那么可以使用以下正则表达式


(?我不认为这个正则表达式真的有效。
1;
2;
\p{iscyrical}
不匹配。与“(.*)1.([\\p{iscyrical}]*)(.*)”我只能提取,不能提取1;2;。你说得对。你能为我的文本提供正确的表达形式吗?你需要首先定义你想要匹配的内容-除了西里尔字母外,在匹配中还允许哪些内容?这个表达不适合1。你应该用[\\d\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\s]替换:-[\\s\\\\\\\\\\\\\\\s]首先。。它的
1。\\s
也可以工作。无法添加此表达式片段以匹配1。“Jain,这不应该有什么区别,因为在字符类中顺序并不重要”。@sperr0w,我不确定它是如何失败的。我认为这个问题可能没有得到很好的定义。我需要的是表达式,而不是代码片段。实际上,我从StarDict字典的文章中得到了一个非常大的texp。这效率要低得多,而且还有潜在的问题。当然,它对示例数据有效,但其余数据是什么样子的?您不再强制内部字符是西里尔字母,也不再检查事物是否以正确的顺序出现。如果有
标记之外的内容,您将作为结果的一部分呈现出来。正则表达式是完成这项工作的合适工具。我明白了,但我只是想说正则表达式并不总是一个好主意,有时编写和维护一个代码片段一步一步地完成它会更容易。此外,这看起来像是在解析XML或HTML,也许我们应该在这里使用一个完整的解析器。它只匹配每个单词中的一个西里尔字母。тест 2. 1) ветка; 并且它只返回一个值;当然,为特定模式制作的一个正则表达式将在其他正则表达式中失败。。您需要精确地指定要匹配的所有模式??好的,如果我有文本:1。тест 2. 1) ветка; 什么表达式返回?您希望它只返回一次吗?那为什么不跟它比较一下呢??那么你不需要正则表达式。。
  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);
    }
  }
<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
тест