regex 正则表达式来提取引号中的所有内容

hgqdbh6s  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(102)

我试图写一个正则表达式来匹配所有出现在封闭字符之间的字符串(最有可能是"-双引号)。这是我在尝试解析csv文件中的一行时经常遇到的一个场景。
所以我有一个样本行,比如:

"Smith, John",25,"21/45, North Avenue",IBM

尝试以下正则表达式:

"(.*)"

但它得到的有点如下:

我期望输出如下:

Smith, John
25
21/45, North Avenue
IBM

我编写的正则表达式试图捕捉示例中"之间的内容。以上是我期待的结果。
但有一种模糊性:我不是在寻找这样的匹配:,25,。这让我有点怀疑正则表达式在这里是否可行。
这句话的正确写法是什么?

d7v8vwbk

d7v8vwbk1#

如果你真的想运行自己的CSV解析器,你需要教你的正则表达式一些规则:
1.一个字段可以不加引号,只要它不包含引号,逗号或换行符。
1.带引号的字段可以包含任何字符;引号通过加倍进行转义。
1.逗号用作分隔符。
因此,要匹配一个CSV字段,您可以使用以下正则表达式:

(?mx)       # Verbose, multiline mode
(?<=^|,)    # Assert there is a comma or start of line before the current position.
(?:         # Start non-capturing group:
 "          # Either match an opening quote, followed by
 (?:        # a non-capturing group:
  ""        #  Either an escaped quote
 |          #  or
  [^"]+     #  any characters except quotes
 )*         # End of inner non-capturing group, repeat as needed.
 "          # Match a closing quote.
|           # OR
 [^,"\r\n]+ # Match any number of characters except commas, quotes or newlines
)           # End of outer non-capturing group
(?=,|$)     # Assert there is a comma or end-of-line after the current position

live on regex101.com

xu3bshqb

xu3bshqb2#

请不要使用正则表达式,CSV应该由解析器处理。
下面是一个现成的解析器:http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
您也可以使用OLEDB内置解析器:http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-built-in-oledb-csv-parser
希望这有帮助

jbose2ul

jbose2ul3#

首先,这只会抓住一个群体。其次,你必须不贪婪:

(?:"(.*?)")

这并不能解决单行中多个匹配项的问题。下面是两个例子:

import re
string = '"Smith, John",25,"21/45, North Avenue",IBM'
pattern = r'(?:"(.*?)")'
re.findall(pattern, string)
> ['Smith, John', '21/45, North Avenue']

在C#中:

string pattern = @"(?:\""(.*?)\"")";
string input = @"\""Smith, John\"",25,\""21/45, North Avenue\"",IBM'";
foreach (Match m in Regex.Matches(input, pattern)) 
    Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);

相关问题