我正在获取stackoverflow来验证大字符串字段的csv。
正则表达式:
(?![^\",][^,]*\")(\"(\"\"|[^\"])*\"|[^\",]*),[0-9]*
TargetString:
“Nuvi 1450LMT是Garmin的便携式全球定位系统接收器,提供公司标准1450和1450T型号的升级。包括免费终身地图和交通更新,此模型可每三个月更新一次,以确保最新的位置信息。内置的FM信号发射器可以提供有关事故,施工和其他形式的道路堵塞的最新交通信息,为用户提供足够的时间来选择备用包括一个背光5英寸触摸屏TFT显示屏,提供清晰的视觉指示,配备“车道辅助”技术,提供精确的使用通道的虚拟第一人称指导。包含全面的“城市导航”地图加拿大,美国和墨西哥,拥有二维和三维支持以及超过600万用户选择的兴趣点.1450LMT也完全支持行人导航,“CityXplorer”为各种主要城市提供公共汽车,铁路,电车和其他公共交通信息服务。燃料效率路线可以通过“EcoRoute”模式确定,而“HotFix”预测卫星技术有助于保持最准确的位置信息,即使信号暂时丢失。 Garmin的“Photo Connect”服务支持照片导航,可通过“Garmin Garage”网站下载其他汽车标记和旁白声音。
有人可以帮助优化它。 您能否使用占有量词进行优化
答案 0 :(得分:3)
我认为最好的建议是不要尝试使用正则表达式来解析CSV文件。你制定正则表达式的任何方式都有可能存在无限数量的分支点......因此病理输入字符串的堆栈溢出。
更好的方法是为Java选择和使用适当的CSV库。检查此问题的答案:
Can you recommend a Java library for reading (and possibly writing) CSV files?
答案 1 :(得分:1)
你可以通过添加几个加号来消除这个错误:
"(?![^\",][^,]*\")(\"(\"\"|[^\"]+)*\"|[^\",]+),[0-9]+"
^ ^ ^
请注意,这些只是常规加号,而非占有性修饰符。第二个和第三个加号替换了星号,但它是第一个产生真正差异的星号。 [^\"]+
消耗了大部分文本,并且在添加加号之前一次只有一个字符。
但它仍然不会匹配,它会更快失败。该正则表达式用于匹配CSV字段与正确转义的引号,如果我理解正确,您的问题是它们不转义。这是一个更具挑战性的问题,但我想知道你是否真的需要处理这些内部引用。这不会起作用吗?
".*?",\d+
...或作为Java字符串文字:
"\".*?\",\\d+"
或者您是否试图通过自己转义引号来纠正字符串?