大文字と小文字の一致検索


14

3つの入力、テキストの文字列T、置換する文字列、F; そして、それらを置き換える文字列RTと同じ(大文字と小文字を区別しない)文字を持つの各部分文字列について、の文字でF置き換えますR。ただし、元のテキストと同じ大文字小文字を使用してください。

より多くの文字が含まれているR場合F、余分な文字は大文字と小文字を区別する必要がありRます。に数字または記号がFある場合、対応する文字はRの大文字小文字を保持する必要がありRます。Fに表示されるとは限りませんT

すべてのテキストが印刷可能なASCII範囲にあると想定できます。

"Text input", "text", "test" -> "Test input"

"tHiS Is a PiEcE oF tExT", "is", "abcde" -> "tHaBcde Abcde a PiEcE oF tExT"

"The birch canoe slid on the smooth planks", "o", " OH MY " -> "The birch can OH MY e slid  OH MY n the sm OH MY  OH MY th planks"

"The score was 10 to 5", "10", "tEn" -> "The score was tEn to 5"

"I wrote my code in Brain$#@!", "$#@!", "Friend" -> "I wrote my code in BrainFriend"

"This challenge was created by Andrew Piliser", "Andrew Piliser", "Martin Ender" -> "This challenge was created by Martin Ender"

// Has a match, but does not match case 
"John does not know", "John Doe", "Jane Doe" -> "Jane does not know"

// No match
"Glue the sheet to the dark blue background", "Glue the sheet to the dark-blue background", "foo" -> "Glue the sheet to the dark blue background"

// Only take full matches
"aaa", "aa", "b" -> "ba"

// Apply matching once across the string as a whole, do not iterate on replaced text
"aaaa", "aa", "a" -> "aa"

"TeXT input", "text", "test" -> "TeST input"

サンドボックスリンク


奇妙なケースの例のリクエスト:"TeXT input", "text", "test"
エンジニアトースト

@EngineerToastの例の追加
アンドリュー

なぜ"The birch canoe slid on the smooth planks", "o", " OH MY "そんなにユーモラスなのかわからないが、私はその例を愛していた。
魔法のタコUr

回答:


3

網膜、116バイト

i`(.+)(?=.*¶\1(¶.*)$)|.*¶.*$
¶¶$2¶$1¶¶
{T`l`L`¶¶.(?=.*¶[A-Z])
T`L`l`¶¶.(?=.*¶[a-z])
}`¶¶¶(.)(.*¶).
$1¶¶¶$2
¶¶¶¶.*|¶

オンラインでお試しください!説明:

i`(.+)(?=.*¶\1(¶.*)$)|.*¶.*$
¶¶$2¶$1¶¶

これは検索TF、一致する先読みに対して大文字と小文字を区別しない一致がある場合は常に、R多数の改行で囲まれ、先読みも挿入されます。

{T`l`L`¶¶.(?=.*¶[A-Z])
T`L`l`¶¶.(?=.*¶[a-z])
}`¶¶¶(.)(.*¶).
$1¶¶¶$2

のコピーの各文字は、Rマッチの文字と一致するように調整されます。その後、次の文字を処理できるように、コピーRまたは一致の文字がなくなるまで作業領域から移動されます。

¶¶¶¶.*|¶

のコピーのR文字がなくなった場合、マッチの残りの前に4つの改行が追加されるため、削除します。そうでない場合、残ったものはコピーの残りの断片となり、そのコピーをR入力の一致しない部分と連結して結果を生成する必要があります。


3

APL(Dyalog)75 73 72バイト

プロンプトのためTRと、Fそのためです。RbはDyalog変換形式Fで指定する必要があり、PCRE形式で指定する必要があります。

⍞⎕R(⍞∘{(⊣⌿d)l¨⍨(1∘⌷≠(⊢⌿d∊⎕A,lA)∧≠⌿)d≠(l819⌶)d←↑⍺⍵.Match↑¨⍨≢⍺})⍠1⊢⍞

オンラインでお試しください!

 プロンプト T

 その結果(1とを分離T

⍞⎕R()⍠1 プロンプトを表示Fし、次の関数の結果とR eplaceが一致します。

⍞∘{…} プロンプトされたfor Rを左引数として結び付けることにより、単項関数を導出します。

  ≢⍺ 文字数を数えます R

  ⍺⍵.Match↑¨⍨ のそれぞれから多くの文字を取得しR、一致
   は左の引数であり、それを結び付けRました。現在見つかった文字列
   Match含む名前空間です。

   これら2つを2行のマトリックスに混ぜる

  d← として保存 d

  ()  次の暗黙関数を適用します:

   819⌶ 小文字(ニーモニック:819Bigのように見える)

   l← その関数を l

  d≠d異なる ブール値(つまり、小文字/大文字ごとに0/1を与える)

  () 次の暗黙関数を適用します:

   ≠⌿ 垂直XOR

   ()∧ 次の配列とのブールAND:

    l⎕A 小文字のAアルファベット

    ⎕A, 大文字アルファベットを追加

    d∊ dの各文字のブール値、そのメンバーかどうか(つまり、文字かどうか)

    ⊢⌿ 最後の行、つまり、文字かどうかの一致の文字

   1∘⌷≠ 最初の行とのXOR、つまりの各文字Rが大文字かどうか

  (…これを)l¨⍨ 使用して、以下の各文字を小文字(0の場合)または大文字(1の場合)にします。

   ⊣⌿ 最初の行、すなわち R


*の⎕OPT 代わりに使用するDyalog Classicのバイトカウント



2

引きこもった。ドムの答えはロングショットでそれを打ち負かす。

Perl 5の、136 + 1(-p)= 137バイト

$f=<>;chomp$f;@R=($r=<>)=~/./g;for$i(/\Q$f/gi){$c=$n='';$"=$R[$c++],$n.=/[A-Z]/?uc$":/[a-z]/?lc$":$"for$i=~/./g;s/\Q$i/$n.substr$r,$c/e}

オンラインでお試しください!

@Dom Hastingsが言及した後、大幅な削減を行いました \Q

Perl 5の、176 + 1(-p)= 177バイト

sub h($){chomp@_;pop=~s/[^a-z0-9 ]/\\$&/gir}$f=h<>;@R=($r=<>)=~/./g;for$i(/$f/gi){$c=$n='';$"=$R[$c++],$n.=/[A-Z]/?uc$":/[a-z]/?lc$":$"for$i=~/./g;$i=h$i;s/$i/$n.substr$r,$c/e}

オンラインでお試しください!


すべてのテストケースに合格しました;)108:オンラインで試してみてください!
ドムヘイスティングス

投稿してください。それはかなり私のものを打ち負かす。
Xcali

けっこうだ!楽しかったです。私は挑戦を楽しんでいます!
ドムヘイスティングス

2

PowerShell、190バイト

param($T,$F,$R)[regex]::Replace($T,'(?i)'+[regex]::escape($F),{param($m)-join(0..$R.Length|%{(($y=$R[$_]),("$y"."To$((('Low','Upp')[($z="$m"[$_])-cmatch($C='[A-Z]')]))er"()))[$z-match$C]})})

オンラインでお試しください!

説明:

[Regex]::Replace( 
    input text T,
    Find text F with case insensitive and [regex]::escape() for symbols,
    {scriptblock} for computing the replacement
)

置き換えスクリプトブロックは以下を行います:

$m is the matched text with case information
loop over each character in R as $y
    $z is the same index character in $m ($null if R overruns)
    $z-match'[A-Z]' checks if alphabetic, so we must to case-match
      otherwise, non-alphabetic or null, no case-match, return $y unchanged.
    if case-matching, check if z case-sensitive matches '[A-Z]' and
      use dynamic method calling from a generated string, either 
      $y."ToLower"()
      $y."ToUpper"()
      to force the match
-join the loop output into a replacement string

テストケース:

function f {
param($T,$F,$R)[regex]::Replace($T,'(?i)'+[regex]::escape($F),{param($m)-join(0..$R.Length|%{(($y=$R[$_]),("$y"."To$((('Low','Upp')[($z="$m"[$_])-cmatch($C='[A-Z]')]))er"()))[$z-match$C]})})
}

Import-Module Pester

$Cases = @(
    @{Text = "Text input"; Find = "text"; Replace = "test"; Result = "Test input" }
    @{Text = "tHiS Is a PiEcE oF tExT"; Find = "is"; Replace = "abcde"; Result = "tHaBcde Abcde a PiEcE oF tExT" }
    @{Text = "The birch canoe slid on the smooth planks"; Find = "o"; Replace = " OH MY "; Result = "The birch can OH MY e slid  OH MY n the sm OH MY  OH MY th planks" }
    @{Text = "The score was 10 to 5"; Find = "10"; Replace = "tEn"; Result = "The score was tEn to 5" }
    @{Text = "I wrote my code in Brain$#@!"; Find = "$#@!"; Replace = "Friend"; Result = "I wrote my code in BrainFriend" }
    @{Text = "This challenge was created by Andrew Piliser"; Find = "Andrew Piliser"; Replace = "Martin Ender"; Result = "This challenge was created by Martin Ender" }
    @{Text = "John does not know"; Find = "John Doe"; Replace = "Jane Doe" ; Result ="Jane does not know" }
    @{Text = "Glue the sheet to the dark blue background"; Find = "Glue the sheet to the dark-blue background"; Replace = "foo"; Result ="Glue the sheet to the dark blue background" }
    @{Text = "aaa" ; Find = "aa"; Replace = "b"; Result ="ba" }
    @{Text = "aaaa"; Find = "aa"; Replace = "a"; Result ="aa" }
    @{Text = "TeXT input"; Find = "text"; Replace = "test"; Result ="TeST input" }
)

Describe "Tests" {

    It "works on /<Text>/<Find>/<Replace>/ == '<Result>'" -TestCases $Cases {
        param($Text, $Find, $Replace, $Result)
        f $Text $Find $Replace | Should -BeExactly $Result
    }

}

1

TXR Lisp、285バイト

(defun f(s f r)(let*((w(copy s))(x(regex-compile ^(compound,(upcase-str f))))(m(reverse(tok-where(upcase-str s)x))))(each((n m))(set[w n]r) (for((i(from n)))((< i (min(to n)(len w))))((inc i))(cond((chr-isupper[s i])(upd[w i]chr-toupper))((chr-islower[s i])(upd[w i]chr-tolower)))))w))

従来の形式のオリジナル:

(defun f (s f r)
  (let* ((w (copy s))
         (x (regex-compile ^(compound ,(upcase-str f))))
         (m (reverse (tok-where (upcase-str s) x))))
    (each ((n m))
      (set [w n] r)
      (for ((i (from n))) ((< i (min (to n) (len w)))) ((inc i))
        (cond ((chr-isupper [s i]) (upd [w i] chr-toupper))
              ((chr-islower [s i]) (upd [w i] chr-tolower)))))
    w))

1

JavaScript、177バイト

(T,F,R)=>T.replace(eval(`/${F.replace(/[-\/\\^$*+?.()|[\]{}]/g,'\\$&')}/gi`),F=>[...R].map((r,i)=>/[A-Z]/i.test(f=F[i]||'')?r[`to${f>'`'&&f<'{'?'Low':'Upp'}erCase`]():r).join``)

少ないゴルフ:

(T,F,R) => T.replace(
    eval(`/${F.replace(/[-\/\\^$*+?.()|[\]{}]/g,'\\$&')}/gi`),
    F=>[...R].map((r,i) =>
        /[A-Z]/i.test(f = F[i] || '')
            ? r[`to${
                f > '`' && f < '{'
                    ? 'Low'
                    : 'Upp'
                }erCase`]()
            : r
    ).join``
)

プログラムはシンボルを処理する必要があるため、47バイトはこの正規表現エスケープ関数から来ました。:(


1

パイソン2193の 200バイト

T,F,R=input()
w=str.lower
i=-len(T)
l=len(F)
T+=' '
while i:
 s=T[i:i+l]
 if w(s)==w(F):T=T[:i]+`[[y,[w(y),y.upper()][x<'a']][x.isalpha()]for x,y in zip(s,R)]`[2::5]+R[l:]+T[i+l:];i+=l-1
 i+=1
print T

オンラインでお試しください!


これ(TIOリンクからの193バイト)は、文字列の最後で一致を見つけることができません。
tehtmi

1

Python 3、183バイト

import re
j="".join
f=lambda T,F,R:j((p,j((y,(y.lower(),y.upper())[x<'a'])[x.isalpha()]for(x,y)in zip(p,R))+R[len(F):])[i%2>0]for i,p in enumerate(re.split('('+re.escape(F)+')',T,0,2)))

オンラインでお試しください!

re.split +すべての偶数要素を保持し、すべての奇数要素を置換文字列の正しい変換で置き換えます。

>>> re.split("(is)","tHiS Is a PiEcE oF tExT",0,2) # 2=re.IGNORE_CASE
['tH', 'iS', ' ', 'Is', ' a PiEcE oF tExT']

1

C(gcc)210 211 207 189バイト

「BrainFriend」テストケースの大文字のバグを修正するために1バイトを追加する必要がありました

うわー、これは退屈だった...今、いくつかのバイトを離れてゴルフに

char*c,*p;d,l;f(t,f,r){for(d=isalpha(*(p=f)),p=c=t;c=strcasestr(c,f);p=c+=l>0?l:0){for(l=strlen(f);p<c;)putchar(*p++);for(p=r;*p;p++,c+=l-->0)putchar(d*l<1?*p:*c&32?*p|32:*p&~32);}puts(p);}

オンラインでお試しください!


私はおそらく明らかなものを見逃していますが、すぐに*(p=f)設定するときになぜ必要なのp=c=tですか?私はそれを試してみましたが*fうまくいきませんでしたので、すぐに上書きされることはありません。
アンドリュー

fはintであるため、逆参照してcharを取得することはできませんが、pはchar *です
cleblanc

ああ、それは理にかなっています。だからそれは書くのより短い方法*((char*)f)ですか?涼しい!
アンドリュー

1

C#(Mono C#コンパイラ)、241バイト

using System.Text.RegularExpressions;
class Program {
static void Main(string[] args) {
r("Text input","text","Test");
}
static void r(string v,string i,string u)
{
System.Console.WriteLine(Regex.Replace(v,i,u,RegexOptions.IgnoreCase)); 
}
}

オンラインでお試しください!


1
PPCGへようこそ!ここでかなりの空白を削除できます。実際には、引数または入力として入力を取得する必要があります(コーディングは禁止されています)。または、実際に関数を含めることができます。Action<string,string,string> r =部品さえ必要ありません
HyperNeutrino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.