我有这样的文字:
有人写道:有些内容。
或
有人说:有些内容。
我希望从“写入”到结尾获取所有内容。
看起来很简单:(said | writes):. *
但是。我的文本示例如下所示:
有人写道:blablabla说:有些内容
在这里,我想只得到'说:一些内容'。 但我的正则表达式将所有内容从“写入”发送到最终。 如何解决这个问题?
答案 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来做。你真的应该巩固你的字符串的模式并强制它的使用,但这是一种解析你的字符串的编程方式。
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;
答案 2 :(得分:1)
答案 3 :(得分:1)
这是你的答案:
var text = "Some guy writes: blablabla, said: some content";
var output = /.*\s(\w+:.*)/.exec(text);
// output[1] contains your answer