4

オプションで、単語内の不明な位置でハイフンでつながれ、連続する行に分割されている特定の単語をテキスト ファイルで検索したいと考えています。

例えば。次の範囲内の「ハイフン付き」に一致:

This sentence contains a hyphena-
ted word.

最も近い (魅力的でない) 解決策:

"h\(-\s*\n\s*\)\?y\(-\s*\n\s*\)\?p\(-\s*\n\s*\)\?h\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?n\(-\s*\n\s*\)\?a\(-\s*\n\s*\)\?t\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?d"

私よりも強力な regex-foo が、検索対象の単語を明確に含む正規表現を考え出すことができることを願っています。そこに「ハイフネーション」を表示したいと思います。次のようなものをエンコードする方法が見つかりませんでした(「hy-ted」と一致するため、とにかくバグがあります):

"{prefix-of:hyphenated}{hyphen/linebreak}{suffix-of:hyphenated}"

ドキュメントを前処理してそのような単語を折りたたむと検索が簡単になることはわかっていますが、関連するツールのためにこれが不可能なコンテキストで使用できる正規表現を探しています。

4

3 に答える 3

1

それhy-phen-atedも一致するはずだということを考えると、これは正規表現だけでは正しい方法ではないと思います。

私はこれを行います(あなたの言語を知らないので、私は擬似コードを使用しました):

  1. 入力からハイフンと改行を削除します
  2. クリーンアップされた入力を.*hyphenated.*

すべての言語でステップ1を簡単に実行でき、コードがはるかに読みやすくなります。

于 2012-10-25T19:22:38.310 に答える
0

これはうまくいくと思います。検索する単語が多い場合は、スクリプトを作成して検索パターンを生成することをお勧めします。

[h\-]+\s*[y\-\s]+[p\-\s]+[h\-\s]+[e\-\s]+[n\-\s]+[a\-\s]+[t\-\s]+[e\-\s]+d\b

使用している言語について言及していないと思いますが、これを .Net でテストしました。

検索パターンを生成する簡単な python スクリプトを次に示します。

# patterngen.py
# Usage:  python patterngen.py <word>
# Example:  python patterngen.py hyphenated

word = sys.argv[1]
pattern = '[' + word[0] + r'\-]+\s*'

for i in range(1,len(word)-1):
    pattern = pattern + r'[' + word[i]
    pattern = pattern + r'\-\s]+'

pattern = pattern + word[-1] + r'\b'
print pattern
于 2012-10-25T19:17:16.047 に答える
0

これにアプローチするもう 1 つの方法は、次のようにハイフネーションを「スライド」することです。

hyphenated|h(-\s*\n\s*)yphenated|hy(-\s*\n\s*)phenated|hyp(-\s*\n\s*)henated|hyph(-\s*\n\s*)enated|hyphe(-\s*\n\s*)nated|hyphen(-\s*\n\s*)ated|hyphena(-\s*\n\s*)ted|hyphenat(-\s*\n\s*)ed|hyphenate(-\s*\n\s*)d

読みやすくなりますが、これが元のパターンに対してどのようにパフォーマンスを維持するかはよくわかりません。


さらに別のアイデアは、最初に次の行に沿ったパターンで検索を絞り込むことです。

h[hypenatd]{0,9}(-\s*\n*\s)?[hypenatd]{0,9}

そして、この結果の中で一致します。

実際、私が間違っていなければ、次のようなグループと一致する場合:

(h[hypenatd]{0,9})(?:-\s*\n*\s)?([hypenatd]{0,9})

次に、単語の出現hyphenatedはすべての一致です。ここで、疑似コード:

(match.group1 + match.group2) == "hyphenated"
于 2012-10-25T19:39:46.593 に答える