【问题标题】:regex--how to match a parentheses followed by non-digit characters?正则表达式 - 如何匹配括号后跟非数字字符?
【发布时间】:2020-02-10 18:11:23
【问题描述】:

我正在制作一个问题数据库,我制作数据库的方法是将一个字符串拆分为一个较小的字符串数组,其中每个字符串都是一个问题及其答案。例如,我的字符串看起来像

var string = "(1) foo? ANSWER: fee (2) fah. ANSWER: feh"

我将字符串拆分为数组的方式是使用以下.match

const arr = string
  .match(/\(\d+[^(]+/g)
  });

.match 中的正则表达式将大问题字符串拆分为字符串数组。现在的方式是,匹配从问题编号的左括号开始,匹配所有内容,直到下一个左括号,即下一个问题编号的开头。所以结果数组看起来像

 ["(1) foo? ANSWER: fee", "(2) fah. ANSWER: feh"]

这很好用,除非问题本身有括号:

var string = "(1) foo foo (faa) foo? ANSWER: fee (2) fah. ANSWER: fah" 

在这种情况下,.match 函数在 ( in (faa ) 处进行拆分,这会抛出数组。我如何修改正则表达式,使其匹配一个左括号,后跟无限数量的非括号字符,但只要后面跟着一个非数字字符就匹配括号?

【问题讨论】:

  • 为什么要解析字符串而不是一开始就将数据存储在对象和数组中?
  • const questions = [{ "q":"foo foo (faa)","a":"fee"}, {"q":"fah?","a":"fah!"}] 可以存储在 JSON.stringify 之后并使用 JSON.parse 读取(或者只是 ajax 作为 JSON)
  • 是的,我知道这样更实用。问题是,我正在复制粘贴数千个问题(不是我写的),而且我没有时间将每个问题都放入具有属性的对象中。我的目标是提取大量问题,将其解析为问题字符串及其答案,然后将这些子字符串转换为对象。

标签: javascript regex string match


【解决方案1】:

您可以使用断言右侧是括号之间的一位或多位数字的位置进行拆分。

(?=\(\d+\))

查看regex demo

var string = "(1) foo foo (faa) foo? ANSWER: fee (2) fah. ANSWER: fah" 
console.log(string.split(/(?=\(\d+\))/g));

【讨论】:

  • 这很好用。你能解释一下前瞻功能是如何工作的吗?
  • 正向前瞻(?= 是一个非消耗性的断言,它会检查直接在右边的内容在这种情况下是括号之间的1个或多个数字。
  • 知道了。谢谢!
猜你喜欢
  • 2014-02-05
  • 2013-10-31
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
相关资源
最近更新 更多