簡體   English   中英

java regex字符串,用“ not \\”分隔

[英]java regex string split by “ not \”

實際上,我只需要用JAVA編寫一個簡單的程序即可將MySQL INSERTS行轉換為CSV文件(每個mysql表等於一個CSV文件)

JAVA中使用正則表達式的最佳解決方案是什么?

我的主要問題是如何正確匹配這樣的值:'this is \\'cool \\'...'(如何忽略轉義的')

例:

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

謝謝

假設您的SQL語句在語法上有效,則可以使用

Pattern regex = Pattern.compile("'(?:\\\\.|[^'\\\\])*'");

獲取與所有單引號字符串匹配的正則表達式,而忽略其中的轉義字符。

沒有所有這些額外的反斜杠的說明

'         # Match '
(?:       # Either match...
 \\.      # an escaped character
|         # or
 [^'\\]   # any character except ' or \
)*        # any number of times.
'         # Match '

給定字符串

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

這個匹配

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

您可以使用此正則表達式匹配非轉義引號內的字符:

(?<!\\)'([^'])(?<!\\)`

這是使用負向后看來斷言引號之前的字符不是曬斜線。

在jave中,您必須兩次轉義(一次為String,一次為正則表達式),因此它看起來像:

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

如果您在linux下工作,我將使用sed來完成所有工作。

四個反斜杠(兩個代表一個反斜杠)加點。 “ '(\\\\\\\\ |。)*'”

盡管正則表達式為您提供了一種非常強大的文本解析機制,但我認為使用非正則表達式解析器可能會更好。 我認為您的代碼將更易於編寫,更易於理解且錯誤更少。

就像是:

  • 找到“ INSERT INTO”
  • 查找表名
  • 查找列名
  • 找到“ VALUES”
  • 查找值集(循環這部分)

編寫正則表達式以完成上述所有操作,並具有可選的列值和可選的值集數量,這並非易事且容易出錯。

您必須使用\\\\\\\\ 在Java字符串中\\\\是一個\\ ,因為反斜杠用於執行空格或控制字符( \\n\\t ,...)。 但是在正則表達式中,反斜杠也用'\\'表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM