如何通过匹配已知的关键字集来提取子字符串[重复]

Posted

技术标签:

【中文标题】如何通过匹配已知的关键字集来提取子字符串[重复]【英文标题】: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]/ 更简洁。 【参考方案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

【讨论】:

以上是关于如何通过匹配已知的关键字集来提取子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

bash shell中字符串匹配正则表达式的子字符串[重复]

通过例子学习正则表达式(基础部分)

从关键字搜索中突出显示数据网格上的所有匹配字符串/子字符串

如何通过数组检查字符串是不是具有匹配的子字符串

使用R从文本中提取子字符串[重复]

从字符串JS中的最后一个提取子字符串[重复]