java正则表达式字符串被“拆分”;不是\“;

java正则表达式字符串被“拆分”;不是\“;,java,regex,Java,Regex,实际上,我只需要用JAVA编写一个简单的程序,将MySQL插入行转换为CSV文件(每个MySQL表等于一个CSV文件) 在JAVA中使用正则表达式的最佳解决方案是什么 我的主要问题是如何正确匹配这样的值:'这是'酷'…' (如何忽略转义') 例如: INSERT INTO `table1` VALUES ('this is \'cool\'...' ,'some2'); INSERT INTO `table1` (`field1`,`field2`) VALUES ('this is \'coo

实际上,我只需要用JAVA编写一个简单的程序,将MySQL插入行转换为CSV文件(每个MySQL表等于一个CSV文件)

在JAVA中使用正则表达式的最佳解决方案是什么

我的主要问题是如何正确匹配这样的值:'这是'酷'…' (如何忽略转义')

例如:

INSERT INTO `table1` VALUES ('this is \'cool\'...' ,'some2');
INSERT INTO `table1` (`field1`,`field2`) VALUES ('this is \'cool\'...' ,'some2');

谢谢四个反斜杠(两个代表反斜杠)加上点。“(\\.\.\.\)*”

四个反斜杠(两个代表反斜杠)加上点。““(\\.\.\.\)*”

您可以使用以下正则表达式匹配非转义引号中的字符:

(?<!\\)'([^'])(?<!\\)`
(?
这是使用负向后看来断言引号前的字符不是斜杠

在jave中,必须进行双重转义(一次用于字符串,一次用于正则表达式),因此它看起来像:

String regex = "(?<!\\\\)'([^'])(?<!\\\\)`";

String regex=“(?您可以使用此正则表达式匹配非转义引号内的字符:

(?<!\\)'([^'])(?<!\\)`
(?
这是使用负向后看来断言引号前的字符不是斜杠

在jave中,必须进行双重转义(一次用于字符串,一次用于正则表达式),因此它看起来像:

String regex = "(?<!\\\\)'([^'])(?<!\\\\)`";

String regex=“(?尽管regex为您提供了一种非常强大的文本解析机制,但我认为使用非regex解析器可能会更好。我认为您的代码将更易于编写、更易于理解,并且bug更少

比如:

  • 查找“插入到”
  • 查找表名
  • 查找列名
  • 查找“值”
  • 查找值集(循环此零件)

使用可选的列值和可选数量的值集编写正则表达式来完成上述所有操作是非常繁琐且容易出错的。

尽管正则表达式为您提供了一种非常强大的文本解析机制,但我认为使用非正则表达式解析器可能会更好。我认为您的代码将更易于编写、更易于理解且数量更少虫子

比如:

  • 查找“插入到”
  • 查找表名
  • 查找列名
  • 查找“值”
  • 查找值集(循环此零件)

使用可选列值和可选数量的值集编写正则表达式来完成上述所有操作是非常容易出错的。

您必须使用
\\\\\
。在Java字符串中
\\
是一个
\
,因为反斜杠用于处理空格或控制字符(
\n
\t
,…)。但在正则表达式中,反斜杠也用“\”表示。

您必须使用
\\\\\
。在Java字符串中
\\
是一个
\
,因为反斜杠用于空格或控制字符(
\n
\t
,…)但在正则表达式中,反斜杠也用“\”表示。

假设SQL语句在语法上有效,可以使用

Pattern regex = Pattern.compile("'(?:\\\\.|[^'\\\\])*'");
获取匹配所有单引号字符串的正则表达式,忽略其中的转义字符

解释没有所有额外的反斜杠:

“#匹配”
(?:#要么匹配。。。
\\.#转义字符
|#或
[^'\]\\除“或”以外的任何字符\
)*#任意次数。
"比赛"
给定字符串

'this', 'is a \' valid', 'string\\', 'even \\\' with', 'escaped quotes.\\\''
这和

'this'
'is a \' valid'
'string\\'
'even \\\' with'
'escaped quotes.\\\''

假设您的SQL语句在语法上是有效的,您可以使用

Pattern regex = Pattern.compile("'(?:\\\\.|[^'\\\\])*'");
获取匹配所有单引号字符串的正则表达式,忽略其中的转义字符

解释没有所有额外的反斜杠:

“#匹配”
(?:#要么匹配。。。
\\.#转义字符
|#或
[^'\]\\除“或”以外的任何字符\
)*#任意次数。
"比赛"
给定字符串

'this', 'is a \' valid', 'string\\', 'even \\\' with', 'escaped quotes.\\\''
这和

'this'
'is a \' valid'
'string\\'
'even \\\' with'
'escaped quotes.\\\''

实际上,你不能忽略它们,你需要将它们转换为非转义,以便写入你的CVS文件。实际上,你不能忽略它们,你需要将它们转换为非转义,以便写入你的CVS文件。如果字符串以转义反斜杠结尾(
“就是这样!\\”
),你该怎么办?如果\\实际上是转义反斜杠的一部分,然后是转义引号:“就是它!\\\”)。正则表达式方法永远不会取代防弹解析器。除非您必须处理输入字符串中的注释(包含您不想匹配的字符串),否则我认为正则表达式方法很好(请参阅我的答案)。如果字符串以转义反斜杠(
'this is it!\\\'
)结尾,你会怎么办?如果\\实际上是转义反斜杠的一部分,那么转义引号是:'this is it!\\\')。正则表达式方法永远不会取代防弹解析器。除非你必须处理注释(包含不想匹配的字符串)在您的输入字符串中,我认为正则表达式方法很好(参见我的答案)。