Regex 为什么这种替换也会删除空白字符?
我正在编写一个脚本来从文件中提取和转换SQL语句。我需要将从gupta sqlbase数据库卸载的sql转换为SQLServer能够理解的sql 一项任务是用兼容的名称替换不允许作为列名的关键字 在下面的代码中,$commands是一个包含sql语句的数组引用。(这里实际上有更多的代码,但我提取了它,因为它在这里不应该相关) 这适用于大多数语句,但在以下命令中,Regex 为什么这种替换也会删除空白字符?,regex,perl,Regex,Perl,我正在编写一个脚本来从文件中提取和转换SQL语句。我需要将从gupta sqlbase数据库卸载的sql转换为SQLServer能够理解的sql 一项任务是用兼容的名称替换不允许作为列名的关键字 在下面的代码中,$commands是一个包含sql语句的数组引用。(这里实际上有更多的代码,但我提取了它,因为它在这里不应该相关) 这适用于大多数语句,但在以下命令中,“DEFAULT”被替换为“\u DEFAULT”,而不是“\u DEFAULT”。因此第二个引号丢失 CREATE TABLE S
“DEFAULT”
被替换为“\u DEFAULT”
,而不是“\u DEFAULT”
。因此第二个引号丢失
CREATE TABLE SYSADM.SUBTYPE ( ID_SUBTYPE INTEGER NOT NULL,
ID_TYPE INTEGER NOT NULL,
TYPE VARCHAR(1),
BEZEICH VARCHAR(60),
NUM_COLOR INTEGER,
NUM_TXTCOLOR INTEGER,
"DEFAULT" SMALLINT,
GENER_ARBA SMALLINT,
PROJEKTPLANUNG SMALLINT)
是否有方法修改正则表达式/子项,使其不会删除第二个引号?或者有其他方法?[^(]
匹配任何非左开头的字符
您希望改用负的零宽度先行断言:
s/\b$kw\b(?!\()/_$kw/gi;
(或者:(?![(])
)
还可以将替换的字符添加回字符串:
s/\b$kw\b([^(])/_$kw$1/gi;
但请注意,这并非在所有情况下都有效。特别是如果关键字后没有任何内容,则此模式将不匹配,而零宽度断言将匹配。[^(]
匹配任何非左开头的字符
您希望改用负的零宽度先行断言:
s/\b$kw\b(?!\()/_$kw/gi;
(或者:(?![(])
)
还可以将替换的字符添加回字符串:
s/\b$kw\b([^(])/_$kw$1/gi;
但请注意,这并不是在所有情况下都有效,特别是如果关键字后面没有任何内容,则此模式将不匹配,而零宽度断言将匹配