正则表达式排除特定字符

5

我有一个正则表达式公式,用于在我的数据中查找特定的模式。具体来说,它从“{}”括号之间的字符开始查找,“p. ”并抓取后面的数字。我注意到,在某些情况下,如果括号后不久没有“p. ”值,它会继续查找下一组括号并抓取后面的数字。

例如,这是我的示例数据:

{Hello}, [1234] (Test). This is sample data used to answer a question {Hello2} [Ch.8 p. 87 gives more information about...

这是我的代码:

\{(.*?)\}(.*?)p\. ([0-9]+)

I want it to return this only:

{Hello2}  [Ch.8 p. 87

但它返回了这个:

{Hello},  [123:456] (Test).  This is stample data used to answer a
question {Hello2}  [Ch.8 p. 87

有没有一种方法可以排除包含“{”的字符串?

4个回答

8

您的模式首先从 { 匹配,然后以非贪婪方式匹配 .*?, 放弃匹配直到它可以匹配一个 p、点、空格和 1 个或多个数字。

这是因为点也可以匹配 {}

您可以使用否定字符类 [^{}] 来不匹配 {}

\{[^{}]*\}[^{}]+p\. [0-9]+

正则表达式演示


0

你的表达似乎很好用,我猜我们只想捕获所需的输出而不是其他的,这可以通过对原始表达式进行轻微修改来实现:

(?:[\s\S]*)(\{(.*?)\}(.*?)p\. [0-9]+)

演示 1

或者这个表达式:

(?:[\s\S]*)(\{.*)

演示2

正则表达式电路

jex.im 可视化正则表达式:

enter image description here

测试

const regex = /(?:[\s\S]*)(\{.*)/gm;
const str = `{Hello},  [123:456] (Test).  This is stample data used to answer a
question {Hello2}  [Ch.8 p. 87`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


0

以下是在Java中的实现方法。正则表达式应该是相当通用的。

      String test = "{Hello2} [Ch.8 p. 87 gives more information about..";
      String pat = "(\\{.*?\\}.*p.*?\\d+)";
      Matcher m = Pattern.compile(pat).matcher(test);
      if (m.find()) {
         System.out.println(m.group(1));
      }

如果您对数据有更多了解,可以提供更具体的信息。例如,每个{}的信息是否从单独的一行开始?数据长什么样子,您想要忽略什么。


0

根据您的示例文本,您可以简化正则表达式并避免在匹配页码之前匹配第二个开放大括号(除非您有其他目的需要捕获组)。例如:

{[^{]*p\.\s\d+
  • { 匹配左花括号
  • [^{]* 匹配除了另一个左花括号以外的所有字符
  • p\.\s\d+ 匹配 "p" 后跟着句点、空格和一个或多个数字

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接