【问题标题】:How to extract sub string by matching the known set of keyword(s) [duplicate]如何通过匹配已知的关键字集来提取子字符串[重复]
【发布时间】:2020-09-08 10:12:38
【问题描述】:

例如尝试在特定代码之后提取子字符串

String sample1 = "/ASDF/096/GHJKL/WER/WER/dv/7906/CODEM/TEAR1331927498xxxxxx/YUII/OPL";
String sample2 = "/CODEM/TEAR1331927498xxxxxx";

String regExpresssion = "[/CODEM/]{6}(^[a-zA-Z0-9|\\s])?";
final Pattern pattern = Pattern.compile(regExpresssion);
final Matcher matcher = pattern.matcher(sample1);
if (matcher.find()) {
  String subStringOut = sample1.substring(matcher.end());
}

subStringOut for sample 1  > TEAR1331927498xxxxxx/YUII/OPL
subStringOut for sample 2  > TEAR1331927498xxxxxx

上面的代码工作正常,但现在我需要在下面的示例的正则表达式中再添加一个标识符“/CODER/”

String sample3 = "/ASDF/096/GHJKL/WER/WER/dv/7906/CODER/TEAR1331927498xxxxxx/YUII/OPL";

我试过了

String regExpresssion = "[/CODEM/|/CODER/]{6}(^[a-zA-Z0-9|\\s])?"; 

但它不起作用。有什么建议吗?

谢谢!!

【问题讨论】:

  • 你能试试这个例子来演示这个问题吗? regex101.com/r/UOWTje/1
  • 我对您的正则表达式以及它的确切含义感到困惑。文件路径?
  • 你似乎只需要String regExpresssion = "/CODE[MR]/",见demo。您的 [/CODEM/]{6}(^[a-zA-Z0-9|\s])? 正则表达式是一团糟,而且是错误的。它等于 [/CODEM]{6} 正则表达式,因为 (^[a-zA-Z0-9|\s])? 从不匹配任何内容,字符串中的 6 个特定字符后不能有字符串开头。您必须搜索字符序列,如果是这样,则必须从该模式中删除[]{6} 并删除所有冗余部分。当然,您也可以使用/(CODEM|CODER)/,但/CODE[RM]/ 更简洁。

标签: java regex


【解决方案1】:

尝试将[/CODEM/|/CODER/]{6} 替换为/CODE[RM]/

我认为您的意思是匹配整个短语 /CODEM/ 或 /CODER/,但由于您编写它的方式,您接受了 6 个字符长的任何这些字符的任何序列。不过我不完全确定。括号代表一个“字符类”,它们只匹配一个字符,如果你想连续匹配多个字符,你可以使用括号。第二部分对我来说也没有意义,因为指数符号位于短语的中间,在这种情况下,它与一行的开头相匹配。

【讨论】:

  • 谢谢,Wiktor 和 Slackow。正则表达式 /(CODEM|CODER)/ 解决了我的问题。虽然 /CODE[RM]/ 有效,但我可能会得到一个完全不同的短语,比如 RESET,因为 /(CODEM|RESET)/ 会做这件事。
  • 尼克斯,如果您的意思是除了"CODEM""CODER" 之外还有匹配的词,您应该在问题中这样说。请注意,这两个表达式都匹配 "ENCODER",因此您可能需要添加分词符。
  • 还有一点需要记住的是,像/(CODE[RM]|RESET)/ 这样的东西也可以正常工作
【解决方案2】:

只需要看一下assersun
试试(?<=/CODE[MR]/).*

PCRE demo
但在这种情况下适用于 Java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2020-11-17
    • 2021-12-11
    • 2016-10-12
    • 2021-05-10
    相关资源
    最近更新 更多