我有点问题,因为我有点像一个正则表达式的新手。如果重要的话,我正在使用.NET的Regex类。
首先描述我正在使用正则表达式的数据:
这是我的表达:
(".*[^".]);(.*")
这匹配这两行(它们是大型计算机中表格中较大行的一部分,但基本上看起来像这样):
示例1:7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S;T GORANS SJH "
示例2:2.;"1;AVD INGENJOR ";"N";"J";" ";
并且也匹配这个(我希望它不是没有匹配):
;"U";33.75;777.;" ";
正则表达式的含义是在引号(“)中找到所有分号(;)并用冒号(:)替换它们。它可能并不总是在引号之前和之后都有一个分号(如例1)。我想要的输出是:
7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S:T GORANS SJH "
2.;"1:AVD INGENJOR ";"N";"J";" ";
最后一行应该保持不变,因为它在分号前面有一个点(。)和任意数量的数字。
我希望能够将所有这些可能的行与单个正则表达式匹配。我已经有了多个正则表达式的解决方案,但我想要一个更好的方法。我不是很熟悉负面/正面的前瞻/后退,但我感觉解决方案在那个领域的某个地方。
我首先考虑在否定角色类中进行分组,以便我可以否定.75,这是我不想匹配的第一组$ 1。它可以是任何数字而不是75。
任何帮助都会很棒,因为我根本不擅长正则表达式。
谢谢!
答案 0 :(得分:1)
那么,换句话说,只有当分号是引用字符串的一部分时,你才想用分号替换分号吗?
假设引号是正确平衡的,并且引用字符串中没有引号(如"2\" by 4\""
中所示),那么您可以这样做:
resultString = Regex.Replace(subjectString,
@"; # Match a ;
(?= # if it's followed by an odd number of ; -- namely:
[^""\r\n]* # 0+ non-quote, non-linebreak characters
"" # One quote
(?: # followed by...
[^""\r\n]*"" # an even number of non-quote-quote sequences
[^""\r\n]*""
)* # zero or more times
[^""\r\n]* # followed by zero or more non-quotes
$ # until the end of the line.
) # End of lookahead",
":", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
答案 1 :(得分:0)
另一个建议:在';'上拆分,然后浏览数组,如果当前字符串以“但不以...结尾”连接,则将其与下一个字符串连接,其间为':',继续此操作直到找到关闭'“'或者到达阵列的末尾。
使用';'连接所有元素并打印。
顺便说一下,'''不能逃脱?这会使所有解决方案的问题复杂化。答案 2 :(得分:0)
检查此正则表达式:
(?<=("[^"]*";)|([^"];)+)"[^"]*[;][^"]*"
它匹配其中至少有一个分号的引号之间的任何内容,但仅限于引号中的其他内容或引号之外的内容。这可以避免您的问题,我使用您提供的字符串进行检查。
答案 3 :(得分:0)
"[^";\n]*?(;)*?[^";\n]*?
“,没有任何外观构造..它的性能应该优于其他建议的解决方案。你要做的就是用冒号替换第1组\1
。