正则表达式,从最后得到一些匹配

时间:2016-11-29 09:47:00

标签: javascript regex

我有这样的文字:

  

有人写道:有些内容。

  有人说:有些内容。

我希望从“写入”到结尾获取所有内容。

看起来很简单:(said | writes):. *

但是。我的文本示例如下所示:

  

有人写道:blablabla说:有些内容

在这里,我想只得到'说:一些内容'。 但我的正则表达式将所有内容从“写入”发送到最终。 如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

使用^.*捕获前缀你的正则表达式:

^.*((?:said|writes):.*)

请参阅regex demo

初始.*将获取整行(或使用DOTALL修饰符的字符串)并将回溯以适应最后一个<{1}}或said: 在字符串/行上。

writes:中的非捕获组仅用于分组目的,因此只有一个ID = 1的捕获组。

<强>详情:

  • (?:said|writes) - 字符串/行锚的开始(取决于使用的修饰符)
  • ^ - 任意数量的字符尽可能多(因为.*贪婪量词)(除了换行符号,如果不使用DOTALL修饰符)
  • * - 第1组捕获:
    • ((?:said|writes):.*) - (?:said|writes)said字符序列
    • writes - 冒号
    • : - 任何0+字符(如果未使用DOTALL修饰符,则不包括换行符号),直到行/字符串的末尾。

答案 1 :(得分:2)

我没有想到没有定义字符串分裂的内容,你可以用RegExp来做。你真的应该巩固你的字符串的模式并强制它的使用,但这是一种解析你的字符串的编程方式。

&#13;
&#13;
const writes = 'Some guy writes: some content.'
const said = 'Some guy said: some content.'
const blah = 'Some guy writes: blablabla, said: some content'

function objectifyString(str) {
  const reg = /(said|writes):/
  const index = str.search(reg) || 0
  const parts = str.substring(index).split(reg).filter(item => item.length)
  const obj = {}
  const ll = parts.length
  let ii = 0
  
  for (; ii < ll; ii+=2) {
    obj[parts[ii]] = (parts[ii+1]).trim()
  }
  return obj
}

console.log(
  objectifyString(blah)
)
console.log(
  [writes, said, blah].map(objectifyString)
)
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您可以使用正则表达式:^.*(\b\w+:.*)$

正则表达式捕获具有模式"<word>:<some content>$"

的组

demo here

答案 3 :(得分:1)

这是你的答案:

var text = "Some guy writes: blablabla, said: some content";

var output = /.*\s(\w+:.*)/.exec(text);
// output[1] contains your answer