java正则表达式的堆栈溢出

时间:2011-10-31 01:00:34

标签: java regex stack-overflow

我正在获取stackoverflow来验证大字符串字段的csv。

正则表达式:

(?![^\",][^,]*\")(\"(\"\"|[^\"])*\"|[^\",]*),[0-9]*

TargetString:

“Nuvi 1450LMT是Garmin的便携式全球定位系统接收器,提供公司标准1450和1450T型号的升级。包括免费终身地图和交通更新,此模型可每三个月更新一次,以确保最新的位置信息。内置的FM信号发射器可以提供有关事故,施工和其他形式的道路堵塞的最新交通信息,为用户提供足够的时间来选择备用包括一个背光5英寸触摸屏TFT显示屏,提供清晰的视觉指示,配备“车道辅助”技术,提供精确的使用通道的虚拟第一人称指导。包含全面的“城市导航”地图加拿大,美国和墨西哥,拥有二维和三维支持以及超过600万用户选择的兴趣点.1450LMT也完全支持行人导航,“CityXplorer”为各种主要城市提供公共汽车,铁路,电车和其他公共交通信息服务。燃料效率路线可以通过“EcoRoute”模式确定,而“HotFix”预测卫星技术有助于保持最准确的位置信息,即使信号暂时丢失。 Garmin的“Photo Connect”服务支持照片导航,可通过“Garmin Garage”网站下载其他汽车标记和旁白声音。

功能

  • 5英寸背光TFT彩色触摸屏
  • 终身免费流量更新
  • 免费地图
  • MicroSD卡支持
  • 语音提示
  • 车道辅助功能
  • 自动重新路由
  • 路由避免
  • FM流量兼容性
  • EcoRoute路由
  • 自定义兴趣点
  • Garmin车库标记和语音定制“,9

    有人可以帮助优化它。 您能否使用占有量词进行优化

  • 2 个答案:

    答案 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+"
    

    或者您是否试图通过自己转义引号来纠正字符串?