如何使用regex解析字符串

0yycz8jy  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(398)

我对java还很陌生,正在尝试找到一种更好的方法。可能使用正则表达式。

String text = test.get(i).toString()
// text looks like this in string form:
// EnumOption[enumId=test,id=machine]

String checker = text.replace("[","").replace("]","").split(",")[1].split("=")[1];

// checker becomes machine

我的目标是分析它 text 然后再回来 machine . 这就是我在上面代码中所做的。
但这看起来很难看。我想知道什么样的正则表达式可以在这里使用,使这一点更好?或者另一个建议?

3qpi33ja

3qpi33ja1#

正则表达式当然可以使用,但有时性能较差,可读性较差,更容易出现错误。
我建议你不要使用任何你自己没有想到的正则表达式,或者至少完全理解。
附言:我认为你的解决方案实际上是相当可读的。
下面是另一个非正则表达式版本:

String text = "EnumOption[enumId=test,id=machine]";
text = text.substring(text.lastIndexOf('=') + 1);
text = text.substring(0, text.length() - 1);

不是帮你的忙,但是下一票很痛,所以你来吧:

String input = "EnumOption[enumId=test,id=machine]";
Matcher matcher = Pattern.compile("EnumOption\\[enumId=(.+),id=(.+)\\]").matcher(input);
if(!matcher.matches()) {
  throw new RuntimeException("unexpected input: " + input);
}

System.out.println("enumId: " + matcher.group(1));
System.out.println("id: " + matcher.group(2));
lp0sw83n

lp0sw83n2#

假设您使用的是polarion alm api,那么应该使用 EnumOptiongetId 方法,而不是通过字符串对值进行解压和重新分析:

String id = test.get(i).getId();
swvgeqrz

swvgeqrz3#

使用正则表达式“lookback:

(?<=\bid=)[^],]*

参见regex101。

(?<=     )            // Start matching only after what matches inside
    \bid=             // Match "\bid=" (= word boundary then "id="),
          [^],]*      // Match and keep the longest sequence without any ']' or ','

在java中,如下所示:

import java.util.regex.*;

class Main {
  public static void main(String[] args) {
    Pattern pattern = Pattern.compile("(?<=\\bid=)[^],]*");
    Matcher matcher = pattern.matcher("EnumOption[enumId=test,id=machine]");
    if (matcher.find()) {
      System.out.println(matcher.group(0));
    }
  }
}

这会导致

machine
zed5wv10

zed5wv104#

使用replace和split函数不会考虑数据的结构。
如果您想使用regex,您可以只使用一个不带任何lookaround的捕获组,其中enum可以是除 ] 逗号和id可以是除 ] .
id的值将在捕获组1中。

\bEnumOption\[enumId=[^=,\]]+,id=([^\]]+)\]

解释 \bEnumOption 匹配 EnumOption 以单词边界开头 \[enumId= 匹配
[enumId= [^=,\]]+, 匹配1+次任何字符,除了
= , 以及
] id= 逐字匹配 ( 捕获组1 [^\]]+ 匹配1+次任何字符,除了
] )\] 正则表达式演示| java演示

Pattern pattern = Pattern.compile("\\bEnumOption\\[enumId=[^=,\\]]+,id=([^\\]]+)\\]");
Matcher matcher = pattern.matcher("EnumOption[enumId=test,id=machine]");

if (matcher.find()) {
    System.out.println(matcher.group(1));
}

输出

machine

如果可以有更多逗号分隔的值,那么也只能使用取反的字符类来匹配id [^][]* 前后匹配id要保持在方括号边界内。

\bEnumOption\[[^][]*\bid=([^,\]]+)[^][]*\]

在java中

String regex = "\\bEnumOption\\[[^][]*\\bid=([^,\\]]+)[^][]*\\]";

正则表达式演示

相关问题