perl 样式正则表达式 mysqldump 列定义
perl style regex mysqldump column definition
我正在尝试修复 php-mysql-diff 中与解析 mysqldump 列定义有关的错误。
该工具正确解析如下行:
`version_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ucm_item_id` int(10) unsigned NOT NULL,
`ucm_type_id` int(10) unsigned NOT NULL,
`version_note` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Optional version name',
但是在注释中有 ;(分号)或 /(斜杠)的行上失败
`keep_forever` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=auto delete; 1=keep',
原来的部分正则表达式是
'\((?<tableDefinition>[^;\/]+)\)';
见RegExPattern.php:35,我理解为"anything that is not a ; or a /"
我想将其扩展为:"anything that is not a ; or a /, unless it is inside a pair of ' "(单勾)
我试过这样表达:
([^;\/]+(COMMENT\s\'[^\']+\')?)+[^;\/]*?
可以解释为"repeat |no ; or /| followed by an optional DDL COMMENT at least one times followed by an optional set of |no ; or /|"
但是,即使我尝试了许多类似的变体,我也无法使用其中任何一个来解析上面的列
除此之外,评论还可以包含单引号,如“''”(两个单引号)。我以前应用过这个
\'([^\']+|\'\'))\'
(参见 commit)
这也需要以某种方式整合到答案中
参考:匹配 table 和列的原始代码:
/**
* @return string
*/
public static function tables()
{
$pattern = '/(?<creationScript>CREATE\s+TABLE\s+`(?<tableName>\S+)`\s+';
$pattern .= '\((?<tableDefinition>[^;\/]+)\)';
$pattern .= '(?:\s+ENGINE=(?<engine>[^;\s]+))?\s*';
$pattern .= '(?:AUTO_INCREMENT=(?<autoIncrement>\d+))?\s*';
$pattern .= '(?:DEFAULT CHARSET=(?<defaultCharset>[^;\s]+))?\s*)';
$pattern .= '(?:COLLATE=.+?)?\s*';
$pattern .= '(?:\/\*.+?\*\/)?\s*';
$pattern .= ';/';
$pattern .= 's'; // modifier
return $pattern;
}
/**
* @return string
*/
public static function column()
{
$pattern = '/\s*';
$pattern .= '`(?<columnName>\S+?)`\s+';
$pattern .= sprintf('(?<columnType>%s)\s*', implode('|', self::$columnTypeRegExps));
$pattern .= '(?:CHARACTER SET\s+(?<characterSet>\S+))?\s*';
$pattern .= '(?:COLLATE\s+(?<collate>\S+))?\s*';
$pattern .= '(?<nullable>NULL|NOT NULL)?\s*';
$pattern .= '(?<autoIncrement>AUTO_INCREMENT)?\s*';
$pattern .= '(?:DEFAULT (?<defaultValue>\S+|\'[^\']+\'))?\s*';
$pattern .= '(?:ON UPDATE (?<onUpdateValue>\S+))?\s*';
$pattern .= '(?:COMMENT \'(?<comment>[^\']+)\')?\s*';
$pattern .= '(?:,|$)/';
return $pattern;
}
您可能要明确地迎合评论:
修改评论模式:
(COMMENT\s\'[^\']+((\'\')+[^\']*)*\')?
修改表定义模式:
\((?<tableDefinition>([^;\/]+?(.COMMENT.'[^']+(('')[^']*)*'(?!=')))+.*?|[^;\/]+?)\)
我正在尝试修复 php-mysql-diff 中与解析 mysqldump 列定义有关的错误。
该工具正确解析如下行:
`version_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ucm_item_id` int(10) unsigned NOT NULL,
`ucm_type_id` int(10) unsigned NOT NULL,
`version_note` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Optional version name',
但是在注释中有 ;(分号)或 /(斜杠)的行上失败
`keep_forever` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=auto delete; 1=keep',
原来的部分正则表达式是
'\((?<tableDefinition>[^;\/]+)\)';
见RegExPattern.php:35,我理解为"anything that is not a ; or a /"
我想将其扩展为:"anything that is not a ; or a /, unless it is inside a pair of ' "(单勾)
我试过这样表达:
([^;\/]+(COMMENT\s\'[^\']+\')?)+[^;\/]*?
可以解释为"repeat |no ; or /| followed by an optional DDL COMMENT at least one times followed by an optional set of |no ; or /|"
但是,即使我尝试了许多类似的变体,我也无法使用其中任何一个来解析上面的列
除此之外,评论还可以包含单引号,如“''”(两个单引号)。我以前应用过这个
\'([^\']+|\'\'))\'
(参见 commit) 这也需要以某种方式整合到答案中
参考:匹配 table 和列的原始代码:
/**
* @return string
*/
public static function tables()
{
$pattern = '/(?<creationScript>CREATE\s+TABLE\s+`(?<tableName>\S+)`\s+';
$pattern .= '\((?<tableDefinition>[^;\/]+)\)';
$pattern .= '(?:\s+ENGINE=(?<engine>[^;\s]+))?\s*';
$pattern .= '(?:AUTO_INCREMENT=(?<autoIncrement>\d+))?\s*';
$pattern .= '(?:DEFAULT CHARSET=(?<defaultCharset>[^;\s]+))?\s*)';
$pattern .= '(?:COLLATE=.+?)?\s*';
$pattern .= '(?:\/\*.+?\*\/)?\s*';
$pattern .= ';/';
$pattern .= 's'; // modifier
return $pattern;
}
/**
* @return string
*/
public static function column()
{
$pattern = '/\s*';
$pattern .= '`(?<columnName>\S+?)`\s+';
$pattern .= sprintf('(?<columnType>%s)\s*', implode('|', self::$columnTypeRegExps));
$pattern .= '(?:CHARACTER SET\s+(?<characterSet>\S+))?\s*';
$pattern .= '(?:COLLATE\s+(?<collate>\S+))?\s*';
$pattern .= '(?<nullable>NULL|NOT NULL)?\s*';
$pattern .= '(?<autoIncrement>AUTO_INCREMENT)?\s*';
$pattern .= '(?:DEFAULT (?<defaultValue>\S+|\'[^\']+\'))?\s*';
$pattern .= '(?:ON UPDATE (?<onUpdateValue>\S+))?\s*';
$pattern .= '(?:COMMENT \'(?<comment>[^\']+)\')?\s*';
$pattern .= '(?:,|$)/';
return $pattern;
}
您可能要明确地迎合评论:
修改评论模式:
(COMMENT\s\'[^\']+((\'\')+[^\']*)*\')?
修改表定义模式:
\((?<tableDefinition>([^;\/]+?(.COMMENT.'[^']+(('')[^']*)*'(?!=')))+.*?|[^;\/]+?)\)