我正在尝试编写一个小实用程序,它可以将大约8000个源代码文件中的某些变量替换为其他格式。
例如,我在Progress4GL上编写了以下类型的源代码。 注意:Progress4GL允许在变量名中使用连字符:
where x-crudefn.segment-id[5] =crudefn.segment-id[v-idx]
我需要确切地找到crudefn.segment-id
当我使用正则表达式(crudefn.segment-id)(\[)
时,它会在等号的两个部分找到它。
在这种情况下,x-crudefn.segment-id
是另一个变量,我不想替换它。
我只想替换变量crudefn.segment-id
当我尝试使用正则表达式[^\-](crudefn.segment-id)(\[)
忽略连字符时,它还包含匹配结果("=crudefn.segment-id[")
中的等号,这是我不想要的。在某些情况下,源代码如下:
where x-crudefn.segment-id[5] =crudefn.segment-id[v-idx]
在其他一些情况下就是这样:
where x-crudefn.segment-id[5] = a + crudefn.segment-id[v-idx]
答案 0 :(得分:1)
您似乎希望将crudefn
字作为整个单词匹配,但不包括连字符后的位置。
您可以使用
(?<!-)\bcrudefn\.segment-id\[
请参阅regex demo
\b
字边界将使单词crudefn
在非单词字符后匹配,如果连字符出现在此前面,则负向后看(?<!-)
将使匹配失败字。
另请注意,必须转义一个点以匹配文字点(否则,它将匹配除换行符之外的任何字符。)
在Java中,
String pattern = "(?<!-)\\bcrudefn\\.segment-id\\[";
答案 1 :(得分:0)
您应该查找变量名称的构成 然后围绕它构建一个正则表达式。
即。以一个单词开头,以一个单词结尾等等......
(?<![-\w])crudefn\.segment-id(?![-\w])
这样你就不必担心愚蠢的单词边界了 和虚假的标点符号。