簡體   English   中英

正則表達式-如何查找單詞和帶引號的短語

[英]Regular Expression - How To Find Words and Quoted Phrases

我想說一串以下內容:

Guiness Harp "Holy Moses"

因此,在C#或VB中獲得以下匹配集:

Guiness
Harp
Holy Moses

本質上,除非空格之間沒有引號,否則它會在空格上分開,然后將引號之間的那些單詞視為單個短語。

謝謝,凱文

如果在帶引號的字符串中沒有任何引號(轉義或雙引號),則可以搜索

 "[^"]*"|\S+

但是,引號將成為匹配項的一部分。 如果需要,可以將正則表達式擴展為也處理帶引號的字符串中的引號。

另一種(在這種情況下更好)的可能性是使用csv解析器。

例如(Python):

import csv
reader = csv.reader(open('test.txt'), delimiter=' ', quotechar='"')
for row in reader:
    print(row)

這是另一種方法:

string s0 = @"Guiness Harp ""Holy Moses""";
Regex r = new Regex(@"""(?<FIELD>[^""]*)""|(?<FIELD>\S+)");
foreach (Match m in r.Matches(s0))
{
  Console.WriteLine(m.Groups["FIELD"].Value);
}

這利用了一個事實,即.NET正則表達式使您可以在同一正則表達式中重用組名。 很少有正則表達式允許這樣做,並且其中只有Perl 6像.NET一樣靈活。

正則表達式無法計數,這使定界符解析變得困難。

我將為此使用解析器而不是正則表達式。

如果這是一個簡單的解析,則可以修剪開始和結束引號。

string text = "Guiness Harp \"Holy Moses\"";
string pattern = @"""[^""]*""|\S+";

MatchCollection matches = Regex.Matches( text, pattern );
foreach( Match match in matches )
{
    string value = match.Value.Trim( '"' );
    Console.Out.WriteLine( value );
}

但是,此實現不是很靈活。 我只會在內部工具中使用類似的東西。 否則您不介意丟棄代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM