故意忽略连字符

时间:2016-05-16 17:56:05

标签: java regex

我正在尝试编写一个小实用程序,它可以将大约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]

2 个答案:

答案 0 :(得分:1)

您似乎希望将crudefn字作为整个单词匹配,但不包括连字符后的位置。

您可以使用

(?<!-)\bcrudefn\.segment-id\[

请参阅regex demo

\b字边界将使单词crudefn在非单词字符后匹配,如果连字符出现在此前面,则负向后看(?<!-)将使匹配失败字。

另请注意,必须转义一个点以匹配文字点(否则,它将匹配除换行符之外的任何字符。)

在Java中,

String pattern = "(?<!-)\\bcrudefn\\.segment-id\\[";

答案 1 :(得分:0)

您应该查找变量名称的构成 然后围绕它构建一个正则表达式。

即。以一个单词开头,以一个单词结尾等等......

(?<![-\w])crudefn\.segment-id(?![-\w])

这样你就不必担心愚蠢的单词边界了 和虚假的标点符号。

https://regex101.com/r/qQ6zZ8/4