如何通过匹配已知的关键字集来提取子字符串[重复]
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
【讨论】:
以上是关于如何通过匹配已知的关键字集来提取子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章