正则表达式字符串捕获javascript
我不熟悉javascript中的正则表达式。我有一个字符串,如下所示: “和此处某物(此处某物和(此处某物)此处某物或其他某物)asdf(或asdfas)和此处某物或此处某物(此处的其他内容和其他内容或其他内容) 从上面的字符串中,我尝试根据以下规则捕获一组文本:正则表达式字符串捕获javascript,javascript,jquery,regex,Javascript,Jquery,Regex,我不熟悉javascript中的正则表达式。我有一个字符串,如下所示: “和此处某物(此处某物和(此处某物)此处某物或其他某物)asdf(或asdfas)和此处某物或此处某物(此处的其他内容和其他内容或其他内容) 从上面的字符串中,我尝试根据以下规则捕获一组文本: 捕获以和“或或”开头,以或“或和”结尾的行 捕获的行可以有许多括号 如果运算符”或“或”和“在括号中,则忽略它们 从上面的字符串中,我期望得到如下所示的一组结果 和此处某物(此处某物和(此处某物)其他某物或其他某物)asdf(或
- 捕获以
或和“
开头,以或”
或或“
结尾的行和”
- 捕获的行可以有许多括号
- 如果运算符
或”或“
在括号中,则忽略它们”和“
- 和此处某物(此处某物和(此处某物)其他某物或其他某物)asdf(或asdfas)
- 还有这里
- 或者这里的某样东西(这里的某样东西和其他的东西或其他的东西)
(and|or)\s.((?!(and|or)).)*
我也可以使用非正则表达式解决方案。此解决方案应该适合您的需要():
\b(?:和|或)\b((?:[(][^)]+[)].+?)(?=\b(?:和|或)\b |$)
AND/OR之间的数据将在第一组中捕获。这是一把工作小提琴
(如果您对支持嵌套括号的示例感兴趣,我会在回答的底部添加一个)
这个实现并不是纯粹的正则表达式,但是,在我看来,它是可以理解的。它循环遍历字符串,并以非常简单的方式完全执行您指定的操作
假设我们有我们的字符串:
var str="and something here ( something else here and something else or something else) and something here or something here ( something else here and something else or something else)";
我们可以根据相关标点符号:
var tokens = str.split(/( |\(|\))/g)
其结果是:
["and", " ", "something", " ", "here", " ", "", "(", "", " ", "something", " ", "else", " ", "here", " ", "and", " ", "something", " ", "else", " ", "or", " ", "something", " ", "else", ")", "", " ", "and", " ", "something", " ", "here", " ", "or", " ", "something", " ", "here", " ", "", "(", "", " ", "something", " ", "else", " ", "here", " ", "and", " ", "something", " ", "else", " ", "or", " ", "something", " ", "else", ")", ""]
现在,我们可以迭代这些标记并简单地检查句子:
var str=“和某物在这里(某物在这里和某物或其他东西)和某物在这里或这里(某物在这里和其他东西或其他东西)”
var-tokens=str.split(/(|\(|\)/g);
var inParans=假;
var语句=[];
var lastIndex=0;
对于(var i=0;i当你写括号时,你是指括号吗?它应该只匹配或或和,而不匹配包含它们的单词。比如“more”、“form”、“andy”…哦,你说捕捉一行并实际显示所需的结果。请更具体地阐述你的问题和成功标准。@格林先生,你怎么能接受这样的答案?这个正则表达式完全无法维护。第一天你必须更改某些内容,你将完全卡住,并将重新进行。它正在工作有些不同..请查看此字符串t0.ads=“default”和sdfasdfa('sdf_asdf')搜索(asdfasd或asdf+asdfd或asdf&asdf或default)”)和asdf(t0.asdf,t0.asdf,“RTAM”,t0.sadf,t0.rs,t0.sadf)=和msadfdsa asd fasf(t0.asdf,t0.asdf,t0.rs,t0.saf,t0.sadf)asdf!=“”和asdfsdaf作为hlink!=“
如果嵌套括号是可以接受的(我也不会感到惊讶),那么任何正则表达式解决方案都不会起作用。请参见示例:如果允许嵌套括号,则此操作失败。试试这个字符串:“和这里的某物(这里的某物和其他的某物(越来越多)或其他的)和这里的某物或这里的某物(这里的某物和其他的某物或其他的)”
@ScottSauyet:如果允许嵌套括号,唯一可能的解决方案是递归下降。OP并没有这样说——那为什么你在关于筑巢的每一个答案上都像一个破纪录的人一样继续下去呢?@SébastienRenauld:嗯,我只做了两次,关于两个非常不同的解决方案。但OP确实(在对的评论中)加入了第二个样本,如果我阅读正确的话,这个样本的格式似乎不是特别好,但确实包含了文本“或default”))和
”,这向我强烈建议可能需要嵌套的括号。@BenjaminGruenbaum:是的,我本来打算这么做的,但我的简单尝试失败了。我想我只是做了些蠢事。但这应该行得通。我认为用这个来更新答案也很好。(别忘了不要让计数低于零。)@BenjaminGruenbaum:很好。绝对不是正则表达式的好选择,除非OP真的想要一个更简单的例子。谢谢你的讨论。
var tokens = str.split(/( |\(|\))/g);
var inParans = false;
var sentences = [];
var lastIndex = 0;
for(var i=0;i<tokens.length;i++){
if(tokens[i] === "("){
inParans = true;
} else
if(tokens[i] === ")"){
inParans = false;
} else
if((tokens[i] === "and" || tokens[i] === "or") && !inParans){
sentences.push(tokens.slice(lastIndex,i).join("")); // add sentence
lastIndex = i;
}
}
sentences.push(tokens.slice(lastIndex).join(""));
document.body.innerHTML = (sentences.join("<br />"));
var tokens = str.split(/( |\(|\))/g);
var inParans = 0;
var sentences = [];
var lastIndex = 0;
for(var i=0;i<tokens.length;i++){
if(tokens[i] === "("){
inParans++;
} else
if(tokens[i] === ")"){
inParans--;
if(inParans < 0){ //invalid syntax
throw new Error("Invalid syntax");
}
//If you don't want this to be an error, you can do what Scott suggested and do
// inParans = Math.max(inParans - 1, 0);
} else
if((tokens[i] === "and" || tokens[i] === "or") && (inParans===0)){ // no nesting added check
sentences.push(tokens.slice(lastIndex,i).join("")); // add sentence
lastIndex = i;
}
}
sentences.push(tokens.slice(lastIndex).join(""));
document.body.innerHTML = (sentences.join("<br />"));