如何使用正则表达式匹配引号中的字符串

14

假设我有一个文本文件,其中包含以下文本:

第一篇文章

“一些文本”

“124arandom txt that should not be parsed!@”

“124 Some Text”

“어떤 글”

这个文本需要逐行读取。我想匹配以下字符串:Some Text124 Some Text어떤 글。注意:如果引号内包含外语,也需要进行匹配。

更新:

我发现了一些奇怪的事情。我尝试了一些随机的东西,发现:

string s = "어떤 글"
Regex regex = new Regex("[^\"]*");
MatchCollection matches = regex.Matches(s);

匹配项数量为10,且生成了一些空项(解析文本在索引2中)。这可能是我在仅执行Regex.Replace时一直获取空字符串的原因。为什么会发生这种情况?


在发布这个问题之前,您是否查看了相关的问题? - JleruOHeP
@JleruOHeP 我试过了,但它们并没有真正有用。 - TtT23
甚至从右边开始数第一个 - https://dev59.com/dXRC5IYBdhLWcg3wMeHf?rq=1 ? - JleruOHeP
@JleruOHeP 请查看我上面写的catch,您会看到我的问题与众不同。它需要捕获所有语言中可能出现的引号内的任何文本。此外,您提供的链接显示了如何匹配括号之间的字符串。 - TtT23
你没有将正则表达式锚定,它可能从字符串的任何位置开始匹配。因为你使用的是星号而不是加号,所以允许空匹配。在第一个引号之前和最后一个引号之后存在一个空匹配。 - Zarat
显示剩余2条评论
3个回答

28

如果您逐行阅读文本,则正则表达式

"[^"]*"

这将会找到所有带引号的字符串,除非它们内部包含转义引号,例如 "a 2\" by 4\" board"

要正确匹配这些字符串,您需要

"(?:\\.|[^"\\])*"

如果您不想将引号作为匹配的一部分,请使用环视断言

(?<=")[^"]*(?=")
(?<=")(?:\\.|[^"\\])*(?=")

这些正则表达式作为C#正则表达式,可以像这样创建:

Regex regex1 = new Regex(@"(?<="")[^\""]*(?="")");
Regex regex2 = new Regex(@"(?<="")(?:\\.|[^""\\])*(?="")");

我尝试过这个,但它不适用于外语。可能的原因是什么? - TtT23
[^"] 匹配除引号外的任何字符,因此它也可以匹配外语中的字符。您如何使用正则表达式?可能涉及从右到左的语言吗? - Tim Pietzcker
@l46kok:你需要使用逐字字符串,并对包含正则表达式的字符串中的引号进行转义:Regex regex = new Regex(@"""[^\""]*"""); - Tim Pietzcker
你上面给我的代码似乎非常有效,但它也捕获了引号和匹配的字符串。有没有办法避免引号? - TtT23
@l46kok:抱歉回复晚了,我不在办公室;我现在已经编辑了我的答案,将匹配中的引号排除在外。 - Tim Pietzcker
显示剩余2条评论

0
你可以使用正则表达式,然后尝试将其与任何想要的文本匹配。可以在循环中或者其他需要的地方使用。
string str = "\"your text\"";
//check for at least on char inside the qoutes
Regex r = new Regex("\".+\"");
bool ismatch = r.IsMatch(str); 

我以为在C#中,引号是通过加倍来转义的? - Tim Pietzcker
不,它们不是。转义字符是“\”,如果您想在文本中包含引号,则需要在其前面放置“\”或在整个文本之前放置“@”,例如:@""hi all"" = ""hi all"" = 打印文本 "hi all"。 - YAYAYAYA
啊,好的,我在C#中总是使用@字符串来表示正则表达式,因为很可能需要用到反斜杠来表示正则表达式本身 :) - Tim Pietzcker
如果需要在字符串中添加 \,请写成 \。 - YAYAYAYA

0
对于Javascript(和Typescript),正确的RegExp是:
let matchDoubleQuotedString = /"(?:[^"]|\")*"/

let matchSingleQuotedString = /'(?:[^']|\')*'/

let matchQuotedString = /"(?:[^"]|\")*"|'(?:[^']|\')*'/

匹配单引号字符或反斜杠和引号(零次或多次)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接