我找不到任何切实可行的方法,我自己:
应该匹配APPLE
APPLE APPLE 应该会产生两场比赛
APPLE(APPLE)应该会导致一场比赛
(BANANA APPLE)应导致无匹配
()APPLE()应该会产生一个匹配
括号可以通过多行的任意长度的文本与想要的字符串分开。任何配置中都可以存在不包含该字符串的其他括号。
编辑到目前为止,没有任何答案(并感谢他们!)允许括号之间的换行符。这不可能吗?
答案 0 :(得分:5)
希望这样可以正常使用
正则表达式:(?<!\()\bAPPLE\b(?![\w\s]*[\)])
\b
字边界
(?![\w\s]*[\)])
负面预测) followed by words or spaces
(?<!\()
负面看待(
答案 1 :(得分:1)
试试这个正则表达式(如果你不需要javascript正则表达式):
(?<!\()\b\w+\b(?![\)])
(..\n..)
之间可能有一些复杂的文字。所以我建议:
1-在开头添加)
,在(
添加到字符串结尾!等待!
2-使用此正则表达式/\)[^\(]*\b(\w+)\b[^\)]*\(/
拆分文本或执行此正则表达式,两种类似方式!
3-您从括号中提取文本,并且可以使用/\b\w+\b/
来匹配原始文本中括号外的单词。 /\bAPPLE\b/
适用于APPLE。
例如:
var mytext = "Long text (for finding APPLE word and maybe replace\n"+
"by bold APPLE or something else!)\n"+
"So if APPLE APPLE and APPLE appear out of parenthesis\n"+
"they should convert to bold APPLE !" ;
mytext = ")" + mytext + "(" ;
var r= new RegExp(/\)[^\(]*\b(\w+)\b[^\)]*\(/g);
var res = mytext.match(r) ;
console.log(res);
//for each matched item in res,
// find APPLE and replace with new value
// by this regex: /\b\w+\b/g
在这种情况下,您可以忽略"(BANANA APPLE what? no! it's not working :P should)"
或更复杂文本中的APPLE!
答案 2 :(得分:1)
由于您的样本输入都适当地关闭了每个左括号,因此不需要使用负向lookbehind(需要固定宽度模式)。只需要负面的预测。
这种模式与Sahil的答案一样准确,但效率更高,并删除了不必要的模式组件......
\bAPPLE\b(?![A-Z\s]*\))
使用此测试字符串......
APPLE (BANANA) APPLE (ORANGE)
(BANANA APPLE APPLE ORANGE)
APPLE APPLE APPLE
(APPLE ORANGE BANANA)
APPLE (APPLE)
PINEAPPLE
(BANANA APPLE)
() APPLE ()
(ORANGE KIWI
APPLE
KIWI)
(ORANGE APPLE) APPLE
......我的模式以183个步骤完成。 Sahil的模式需要228步。他的模式不必要地使用:负面的后视,\w
包含更多不必要的字符,以及负面的loohahead中的字符类。