【问题标题】:Need Java regular expression [duplicate]需要Java正则表达式[重复]
【发布时间】:2016-04-30 05:06:07
【问题描述】:

我需要一个正则表达式,它应该用空格解析字符串,如果空格存在于以引号(单/双)结尾的字符串中,那么它不应该解析。

abc cde 'efg hij'k lmn'opq rst' 'ijk lmn' u'v'w xyz 'abc' \'\\\\\'  \'_Notes.txt\'

需求O/P:

abc
cde
'efg hij'k
lmn'opq rst'
'ijk lmn'
u'v'w 
xyz
'abc'
\'\\\\\'
\'_Notes.txt\'

我使用下面的模式来满足我的要求,但这个解析如下所示

Pattern p = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");

O/P:

abc
cde
'efg hij'         //here k is missing
lmn'opq
rst'
'ijk lmn'
u'v'w 
xyz
'abc'
'\\'   //here original string is \'\\\\\'
'_Notes.txt' //here origina string \'_Notes.txt\'

【问题讨论】:

    标签: java regex


    【解决方案1】:

    看起来您只需要让您的正则表达式找到您描述的一个或多个子模式。所以试试

    Pattern p = Pattern.compile("([^\\s\"']+|\"([^\"]*)\"|'([^']*)')+");
    //                           ^---------------------------------^^- add this
    

    DEMO

    【讨论】:

    • 这几乎可以工作,除了特殊字符后跟斜杠,你的模式的 O/P 是(请检查最后两个单词 abc cde 'efg hij'k lmn'opq rst' 'ijk lmn' u' v'w xyz 'abc' '\\' //这里需要原词\'\\\\\' '_Notes.txt' //这里需要\'_Notes.txt\' 非常感谢你的帮助!
    • 为了更好地帮助您,我需要更多信息,因为目前我不确定我是否正确理解了您的情况。您解析的文本来自哪里?它是来自像 "ab\\cd" 这样的字符串文字,还是来自其他来源,如包含 ab\cd 的文本文件(请注意,文字表示与存储在文件中的文本相同的文本,因为 \ 在字符串文字中很特殊,需要额外的转义)。如果我创建代表您的文本的字符串文字,例如 String text = "abc cde 'efg hij'k lmn'opq rst' 'ijk lmn' u'v'w xyz 'abc' \\'\\\\\\\\\\' \\'_Notes.txt\\'"; 我得到 \'\\\\\'
    • 这是从后端获取的 sql 文本,只要出现特殊字符用斜线填充以执行 sql w/o 错误所以我正在解析 sql 然后格式化文件中的文本。我的目的是执行 sql w /o 从保存的文件中修改
    • 所以这是XY problem的另一个例子。无论如何,我在这个答案链接中包含了指向 ideone 的我的答案演示,这表明它工作正常(基于你的 Requirement O/P)。我需要做的就是创建正确的字符串文字,它将代表您问题中的文本(我需要用\\ 转义每个\)但是当您从文件中读取时您不应该遇到这个问题。所以我看不出有什么问题。也许问一个新问题,您将在其中解释您到底想做什么以及它是如何不起作用的。
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多