关于regex:Java-提取两个特殊字符之间的字符串的一部分

Java- Extract part of a string between two special characters

我一直在尝试找出如何提取两个特殊字符之间的字符串的一部分'和"我一直在研究正则表达式,但是坦率地说,我无法理解它。
Java代码示例:

1
String str="21*90'89"";

我想掏出89

一般来说,我想知道如何在两个特定字符之间提取字符串的一部分。

另外,很高兴知道如何从一开始就将字符串的一部分提取到特定字符,例如21。


尝试以下正则表达式:

1
'(.*?)"

作为Java字符串文字,您必须按以下方式编写:

1
"'(.*?)""

这是一个更完整的示例,演示如何在Matcher

中使用此正则表达式

1
2
3
4
5
Pattern pattern = Pattern.compile("'(.*?)"");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

查看其在线运行:ideone


如果您总是有这样的字符串(包含3个部分),那么这就足够了:

1
2
 String str="21*90'89"";
 String between = str.split("
"|'")[1];

1
2
3
4
5
6
public static void main(final String[] args) {
    final String str ="21*90'89"";
    final Pattern pattern = Pattern.compile("
[\\\\*'"]");
    final String[] result = pattern.split(str);
    System.out.println(Arrays.toString(result));
}

您正在寻找的是...上述程序产生:

1
[21, 90, 89]


另一种选择,如果您可以确保字符串始终采用您提供的格式,则可以使用快捷的子字符串/ indexOf解决方案:

1
str.substring(str.indexOf("'") + 1, str.indexOf("""));

并获取您要求的第二条数据:

1
str.substring(0, str.indexOf("*"));

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    String str="abc#defg@lmn!tp?pqr*tsd";              
    String special="!?@#$%^&*()/<>{}[]:;'`~";          
    ArrayList<Integer> al=new ArrayList<Integer>();        
    for(int i=0;i<str.length();i++)
    {
        for(int j=0;j<special.length();j++)
            if(str.charAt(i)==special.charAt(j))        
                al.add(i);
    }
    for(int i=0;i<al.size()-1;i++)
    {
        int start=al.get(i);
        int end=al.get(i+1);
        for(int j=start+1;j<end;j++)
            System.out.print(str.charAt(j));
        System.out.print("");
    }

我在这里缺少最简单的解决方案:

1
str.replaceFirst(".*'(.*)".*","$1");

此解决方案是最短的,但是它有一些缺点:

  • 如果字符串看起来不同,则可以不经警告就将整个字符串取回。
  • 这不是很有效,因为使用过的正则表达式会针对每次使用进行编译。

我不会使用它,除非是为了快速破解或我真的可以确定输入格式。


1
2
3
String str= 21*90'89;
String part= str.split("[*|'
]");
System.out.println(part[0] +"
"+part[1]);