[英]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
來完成所有工作。
四個反斜杠(兩個代表一個反斜杠)加點。 “ '(\\\\\\\\ |。)*'”
盡管正則表達式為您提供了一種非常強大的文本解析機制,但我認為使用非正則表達式解析器可能會更好。 我認為您的代碼將更易於編寫,更易於理解且錯誤更少。
就像是:
編寫正則表達式以完成上述所有操作,並具有可選的列值和可選的值集數量,這並非易事且容易出錯。
您必須使用\\\\\\\\
。 在Java字符串中\\\\
是一個\\
,因為反斜杠用於執行空格或控制字符( \\n
, \\t
,...)。 但是在正則表達式中,反斜杠也用'\\'表示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.