簡體   English   中英

如何使用正則表達式僅匹配單詞?

[英]How to match only words using regex?

這是一個雙重問題。
1.如何隱式加入外來字符?
2. 如何去掉結尾的空字符串?

IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");

以上工作就像一個魅力。 然后德國人出現並開始抱怨他們的一些話被分成兩半。 當字符串包含點或重音字符時會發生這種情況。 解決它的一種方法是在模式中添加更多字符,但是我們有法語、波蘭語和基本上任何非英語語言(只有拉丁字符有效)。

什么是模式化所有字符和數字以及破折號的更好方法?

當我演奏不同的弦時,我也注意到如果末尾有問號,我會得到一個空弦作為最后一個分割部分。 我只是檢查最后一個元素是否為空字符串並立即將其切斷。

為什么我會得到它以及如何擺脫它?

正則表達式 + Linq 怎么樣?

IEnumerable<String> words = Regex.Split(input, @"[^\w0-9-]+")
                                 .Where(s => !String.IsNullOrWhiteSpace(s));

非正則表達式解決方案也是可能的

var words = new string(input.Select(c => char.IsLetterOrDigit(c) || c=='-' ? c : ' ').ToArray())
            .Split()
            .Where(s=>!String.IsNullOrWhiteSpace(s));

請參閱: MSDN: .NET 風格正則表達式的正則表達式中的字符類

編輯:並且,作為參考,有一篇文章解釋了為什么這一切都有效(而 a-zA-Z 無效) here

您還問如何擺脫結尾的空字符串?

String.Split為您提供了擺脫空條目的選項,而Regex.Split則沒有。 由於您使用了? 作為分割點,因為您正在識別用於分割的非單詞字符。 您有兩個簡單的選擇:

  • 測試 IEnumerable 中的空條目
  • 更新您的正則表達式,使其與您的最后一個非單詞字符不匹配

但是,如果您選擇第二個選項,您最終會得到最后一個 IEnumerable 條目中包含的最后一個字符(您的? )。 所以,第一個選項更好,除非你想改變你這樣做的方式來使用正匹配來提取連續的單詞,例如:

MatchCollection m = new Regex("\\w+").Matches(input);
List<string> words = new List<string>();
foreach (Match item in m)
{
    words.Add(item.Value);
}

使用 .NET,這只會匹配單詞(即使它們是雙引號或非字母數字字符的前綴/后綴。

正則表達式(@"[^0-9-!$%^&@#*()_+|~ =`{}[]:;'<>?,./""""""]\\w+")

將匹配變量 txt 中的文本:

var txt = "000 fred is just \"mad:)\"."

與: [“弗雷德”; “是”; “只是”; “瘋狂的”]

暫無
暫無

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

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