【问题标题】:Match words with specific backquoting combinations匹配具有特定反引号组合的单词
【发布时间】:2017-08-11 20:56:43
【问题描述】:

我需要使用正则表达式匹配一个单词,它位于反引号/反引号之间,最多有 1 个和 2 个反引号。

匹配案例

  1. 单词应该以一个或两个反引号开头并以 N 个反引号结尾
  2. 单词应以 N 个反引号开头,并以一个或两个反引号结尾

不应匹配

  1. Word 以三个以上的反引号开头和结尾

示例

I `need` to match a ``word`` from a ```sentence``
Which `lies`` between `backquotes```` and this ``should```` also match
and ```more``` than ```three```````` quotes ```````not```  matched

匹配:

  1. 需要
  2. 谎言
  3. 反引号
  4. 应该

尝试

    Pattern PATTERN = Pattern.compile("`{1,2}\\w+|\\w+`{1,2}", Pattern.DOTALL);

【问题讨论】:

  • 当图案甚至不包含任何点时,您为什么使用DOTALL

标签: java regex pattern-matching


【解决方案1】:

你可以使用

(?<!`)`{1,2}\b(?!`)(.*?)\b`+

请参阅regex demo。获取第 1 组的值。

详情

  • (?&lt;!`) - 当前位置不应以` 开头
  • `{1,2} - 1 或 2 个 ` 匹配
  • \b - 单词边界要求下一个字符是单词字符
  • (?!`) - 1 或 2 个反引号后的下一个字符不能是反引号
  • (.*?) - 匹配并捕获任何 0+ 个字符(考虑使用 Pattern.DOTALL 跨行匹配)
  • \b - 一个单词边界,下一个反引号应该以单词 char 开头
  • `+ - 1 个或多个反引号。

Java demo

String s = "I `need` to match a ``word`` from a ```sentence`` Which `lies`` between `backquotes```` and this ``should```` also match and ```more``` than ```three```````` quotes ```````not```  matched";
Pattern pattern = Pattern.compile("(?<!`)`{1,2}\\b(?!`)(.*?)\\b`+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

【讨论】:

  • @EduardoDennis:不,它will work with quotes,如果 OP 想要匹配不是以单词字符开头和结尾的字符串,它将不起作用。但是,当前的输入表明了这一点。
  • @EduardoDennis:我认为 OP 使用 backquotesbackticks 作为同义词。
  • 不能将\b(?!`) 简化为\w(或者可能是[\d\p{L}]),因为单词字符不能是反引号?而且由于 OP 是在单个单词之后,\w+ 而不是 \b(?!`)(.*?)\b 就足够了吗?
  • @Thomas:也许吧,我假设可能有超过 1 个单词并且可能有 1 个字母的单词。
  • 嗨@WiktorStribiżew,我们如何实现这种情况:单词应该以N个反引号开头并以一个或两个反引号结尾
猜你喜欢
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多