我有一个由 (=) 等号分隔的语言变量列表。示例列表:global.second = second global.minute = minuteglobal.respect = respectglobal.Respect = Respectrespect.count = You have # ${global.respect}give.respect = Get more ${global.respect} by giving others respect.give.Respect = Get more ${global.Respect} by giving others Respect.我一直在为正则表达式苦苦挣扎,因为如果 (=) 等号之后的特定单词存在,我需要捕获整行,如果单词在大括号中,则忽略,但如果该单词在一个之后存在,则仍然捕获整行那是在大括号中。使用示例列表并搜索尊重:IGNORE: global.second = second IGNORE: global.minute = minuteCAPTURE LINE: global.respect = respectCAPTURE LINE: global.Respect = RespectIGNORE: respect.count = You have # ${global.respect}CAPTURE LINE: give.respect = Get more ${global.respect} by giving others respect.CAPTURE LINE: give.Respect = Get more ${global.Respect} by giving others Respect.使用 google 和 stackoverflow 我想出了以下正则表达式:/((?!\{[^\}]*?)(respect)(?![^\{]*?}))$/mi但它不起作用,因为它只捕获了尊重和尊重。为了捕获整行,我将其修改为^(.*=.*?)((?!\{[^\}]*?)(respect)(?![^\{]*?}))$但它仍然只捕获:global.respect = respectglobal.Respect = Respect我是正则表达式新手,我不知道如何制作这个复杂的正则表达式。如果有人可以提供帮助,将不胜感激!我在“显示一些代码”中添加了我的 php 过滤器功能。$search_word 来自我其中一页的输入文本框。function FilterWord($search_word, $main_file_path, $filter_file_path){ $content = file_get_contents($main_file_path); $pattern = preg_quote($search_word, '/'); //$pattern = "/^.*=.*$pattern.*\$/mi"; $pattern = "/(.*=.*?)((?!\{[^\}]*?)($pattern)(?![^\{]*?}))$/mi"; //[^$search_word {}]+(?![^{]*}) //$pattern = "/^.*=.*$pattern.*\$/mi"; //"/^.*=.*(!\$*.$pattern.*)($pattern.*)\$/m"; //$pattern = "/^.*=.*(?!\{.*$pattern.*\}*?)($pattern.*)\$/m"; //((?!\{[^\}]*?)(kudo)(?![^\{]*?})) //$pattern = "/(.*=.*?)(?:(?!\{[^\}]*?)\b)($search_word)(?:\b(?![^\{]*?\}))\$/mi"; if(preg_match_all($pattern, $content, $matches)){ file_put_contents($filter_file_path, implode("\n", $matches[0])); } else{ echo "No matches found"; }};
2 回答
MYYA
TA贡献1868条经验 获得超4个赞
我不确定我是否正确理解了这个问题,但这个表达式可能是一个选项:
\.([A-Za-z]+)\s*(?==)(?=.*\b\1\b.*).*
在这里,我们使用反向引用来捕获我们想要的工作,那么如果该词存在,将获得整行。
- 2 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消