web-dev-qa-db-ja.com

Linqステートメントの正規表現?

特定のXMLファイルを解析するための短いC#を作成しています。ただし、タグ値の1つは変更できますが、where句には常に「高速起動」という単語が含まれます(大文字と小文字は無視されますが、同じ順序にする必要があります)。 C#のSQLのようなステートメントでこれを行う方法がわかりません。

var selected = from cli in doc.Descendants(xmlns+ "Result")
     where cli.Element(xmlns + "ResultsLocation").Value == "Assessments-Fast-Startup"
                       select cli;
14
jerryh91

あなたが正確な文字列を探していると仮定します-String.Containsだけを使用できますか?

var selected = from cli in doc.Descendants(xmlns+ "Result")
     where cli.Element(xmlns + "ResultsLocation").Value.Contains("Assessments-Fast-Startup")
     select cli;

それ以外の場合は、次のようになります。

var rx = new Regex("fast(.*?)startup", RegexOptions.IgnoreCase);

var selected = from cli in doc.Descendants(xmlns+ "Result")
    where rx.IsMatch(cli.Element(xmlns + "ResultsLocation").Value)
    select cli;
15
Dave Bish

_fast[- ]?start[- ]?up_の正規表現が機能するはずです

オプションのdashまたはspaceでWordの部分を区切ることができます

_...
where Regex.IsMatch(
    cli.Element(xmlns + "ResultsLocation").Value, 
    "fast[- ]?start[- ]?up", 
    RegexOptions.IgnoreCase
)
select cli
_

正規表現を微調整する必要がある場合は、 http://regexpal.com/ のような正規表現テスターを試してください。

@DaveBishが述べているように、正規表現や.Contains(...)チェーンの代わりに.ToLower().Contains(...)テストで問題ないかもしれません(nullチェックも必要になる場合があります)

2
MikeM