0

この質問に一致するものが見つかりませんでした。

私はそのような文字列を持っています

var s="one two one-two one-three one one_four"

私の機能は次のとおりです

 function replaceMatches( str, word )
    {
      var pattern=new RegExp( '\\b('+word+')\\b','g' )
      return str.replace( pattern, '' )
    } 

問題は、次のような関数を実行する場合です

var problem=replaceMatches( s,'one' )

それ

returns  two -two -three one_four"

この関数は、本来のようにすべての「1」を置き換えますが、ハイフンのある単語を、ハイフンの前の「1」を置き換える 2 つの単語として扱います。

私の質問は関数についてではなく、正規表現についてです。"one-two" や "one-\w" ではなく、文字列内の "one" という単語のみに一致するリテラル正規表現はどれですか <-私の言いたいことはわかります笑

基本的

var pat=/\b(one)\b/g
"one  one-two one".replace( pat, '')

上記の^を返してほしい

" one-two "

完全一致の「1」のみを置き換えます。「1-2」ではなく、最後の「1」が重要です。一致が最後にある場合、正規表現は機能する必要があります紛らわしい。私は自分の学習を進め、自分のライブラリを拡張しようとしています。

4

3 に答える 3

1

何語だと思いますか?

単語は 1 つ以上の単語文字のシーケンスであり、単語境界\bは単語文字 (および非単語文字) の定義に基づいて定義されます。

\wJavaScript RegExp で定義されている単語の文字は、文字クラスの短縮形です[a-zA-Z0-9_]

あなたの「言葉」の定義は何ですか?あなたの定義が[a-zA-Z0-9_-].

単語境界のエミュレート

この投稿では、後読みと先読みをサポートする言語で単語境界をエミュレートする方法について説明します。残念ながら、JS は後読みをサポートしていません。

one簡単にするために、置き換える単語を想定してみましょう。

次のコードで置換を制限できます。

inputString.replace(/([^a-zA-Z0-9_-]|^)one(?![a-zA-Z0-9_-])/g, "$1")

注:との関連付けを避けるため[a-zA-Z0-9_-]に、代わりに展開された形式を使用します。[\w-]\w

正規表現を分解します。

(
  [^a-zA-Z0-9_-]  # Negated character class of "word" character
  |               # OR
  ^               # Beginning of string
)
one               # Keyword
(?!               # Negative look-ahead
  [a-zA-Z0-9_-]   # Word character
)

(?<![a-zA-Z0-9_-])「単語」文字の否定された文字クラスの文字と^文字列の先頭を一致させることにより、否定的な後読み (サポートされている場合) をエミュレートします。「単語」の文字が見つからない場合、それは「単語」以外の文字か、文字列の先頭である必要があるため、これは当然のことです。後で元に戻すことができるように、すべてがキャプチャ グループにラップされます。

one前後に「単語」文字がない場合にのみ置換されるため、一致を見逃すリスクはありません。

まとめる

「単語」を削除しているため、キーワードに「単語」文字のみが含まれていることを確認する必要があります。

function replaceMatches(str, keyword)
{
    // The keyword must not contain non-"word" characters
    if (!/^[a-zA-Z0-9_-]+$/.test(keyword)) {
        throw "not a word";
    }

    // Customize [a-zA-Z0-9_-] and [^a-zA-Z0-9_-] with your definition of
    // "word" character
    var pattern = new RegExp('([^a-zA-Z0-9_-]|^)' + keyword + '(?![a-zA-Z0-9_-])', 'g')
    return str.replace(pattern, '$1')
}

「単語」文字の定義に正規表現のメタ文字が含まれている場合は、キーワードのメタ文字をエスケープする必要があります。

于 2013-09-17T19:30:47.837 に答える
0

私は JS パターン関数の専門家ではありませんが、関数はすべてを置き換える必要があります。

'one-two' のハイフンについては、oneとの間-が単語境界 (つまり \b) であり
、\w 文字がその前にある場合、文字列の末尾は単語境界です。

しかし、「one」の前にスペースまたは BOL を付けたいと思うかもしれません。
([ ]|^)one\bその場合、置換キャプチャ グループ 1 を作成して、「1 つ」だけを取り除きます。

そして、その関数呼び出しが JS でどのように機能するのかわかりません。

編集:新しい予想される出力の後、正規表現は-

([ ]|^)one(?=[ ]|$)

于 2013-09-17T19:21:41.033 に答える