1. ホーム

[解決済み】JavaのString.contains()メソッドで正規表現を使用する方法

2022-03-17 08:40:24

質問

ある文字列が、"stores", "store", "product" という単語をこの順番で含み、それらの間に何があってもよいかどうかをチェックしたいのです。

を使ってみました。 someString.contains(stores%store%product); と、さらに .contains("stores%store%product");

正規表現を明示的に宣言してメソッドに渡す必要があるのでしょうか、それとも正規表現を一切渡さなくてもいいのでしょうか?

どのように解決するのですか?

文字列を含む

String.contains はStringで動作します。正規表現では動作しません。指定された文字列が現在の文字列の中にあるかどうかをチェックします。

なお String.contains は単語の境界をチェックせず、単に部分文字列をチェックします。

Regexソリューション

Regexは String.contains キーワードに単語の境界を強制することができるからです(他のことも含めて)。つまり、キーワードを 単語 ではなく 部分文字列 .

使用方法 String.matches を以下の正規表現と組み合わせてください。

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

RAW 正規表現 (文字列リテラルで行われたエスケープを除去したもの。上の文字列をプリントアウトするとこうなる)。

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

\b は単語の境界をチェックします。 restores store products . なお stores 3store_product も却下されます。なぜなら、digit と _ は単語の一部とみなされますが、このようなケースが自然文に現れるとは思えません。

単語境界は両側からチェックされるので、上記の正規表現は正確な単語を検索することになる。つまり stores stores product という単語を検索しているので、上記の正規表現にはマッチしません。 store がなく s .

. 通常、任意の文字にマッチします。 ただし 改行文字数 . (?s) を使うと . はどんな文字にも例外なくマッチします (この点を指摘してくれた Tim Pietzcker に感謝します)。