我正在尝试匹配此数据
Combien吗?
Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。 Lorem ipsum。
Combien 2?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum。 Lorem ipsum.Lorem ipsum.Lorem ipsum。 Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum。
模式应匹配每个问题及其相应的答案
例如:
Question 1 = Combien
Answer 1 = Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.
我尝试使用正向超前(javascript),但是没有用。
我尝试过的模式:
^(.+)\xA0*(?=\?)\n*
^(.+)\xA0*(?!\?)$
答案 0 :(得分:2)
您可以将split
与捕获问题一起使用:
str.split(/\s*?^(.*?)\s*\?\s*?[\r\n]+/m).slice(1);
slice
将跳过第一个问题之前的所有文本。结果将是一个数组,其中的条目数为偶数,问答交替出现。
var str = `
Combien ?
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.
Combien 2 ?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.
`;
var qa = str.split(/\s*?^(.*?)\s*\?\s*?[\r\n]+/m).slice(1);
console.log(qa);
如果希望将结果存储在一个不错的对象数组中,其中每个对象都有一个问与答属性,则将reduce
链接到上述代码:
str.split(/\s*?^(.*?)\s*\?\s*?[\r\n]+/m).slice(1)
.reduce((acc, m, i, arr) =>
i%2 ? acc.concat({ question: arr[i-1], answer: m.trim() }) : acc,
[]);
var str = `
Combien ?
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.
Combien 2 ?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.
`;
var qa = str.split(/\s*?^(.*?)\s*\?\s*?[\r\n]+/m).slice(1)
.reduce((acc, m, i, arr) =>
i%2 ? acc.concat({ question: arr[i-1], answer: m.trim() }) : acc,
[]);
console.log(qa);
答案 1 :(得分:2)
此正则表达式应在组1中捕获您的问题,并在组2中捕获答案。
^(\S+(?: \S+)*\s*\?)\s+(\S+(?: \S+)*)$
JS演示
const s = `Combien ?
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.
Combien 2 ?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.
`
let m = null
const reg = new RegExp(/^(\S+(?: \S+)*\s*\?)\s+(\S+(?: \S+)*)$/, 'gm');
while ((m = reg.exec(s)) != null) {
console.log("Question: " + m[1])
console.log("Answer: " + m[2])
}
答案 2 :(得分:1)
如果定界符是一个问号,并且您想匹配到下一个问题,而不是正向查找,则可以使用负向查找shared_preferences
断言该行与格式不匹配的问题:
(?!
说明
^(.+ \?)\n((?:\n(?!.* \?$).*)*)
字符串的开头^
匹配任何1次以上的字符,以空格和问号结尾(.+ \?)
匹配换行符\n
捕获组
(
匹配换行符,负向查找,以确保该字符串不以空格和问号结尾。重复0次以上(?:\n(?!.* \?$).*)*
关闭捕获组
)
答案 3 :(得分:0)
您可以使用(.*\?)\n+(.+)
来获取有关单独捕获组的问题和答案
const str = `Combien ?
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.
Combien 2 ?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.`;
let regex = /(.*\?)\n+(.+)/g,
matches = [], m;
while(m = regex.exec(str))
matches.push({ question: m[1], answer: m[2] })
console.log(matches)
您还可以使用\n?(.+)
来一对一地匹配问题和答案。然后,您可以根据它们的索引将它们分成单独的数组:
const str = `Combien ?
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.
Combien 2 ?
Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum. Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.Lorem ipsum.`;
let regex = /\n?(.+)/g, matches = [], m;
while(m = regex.exec(str))
matches.push(m[1])
console.log("matches \n", matches)
const questions = [], answers = [];
matches.forEach((m, i) => i % 2 ? answers.push(m) : questions.push(m))
console.log("questions \n", questions)
console.log("answers \n", answers)