Büyük / Küçük Harf Eşleştirme Bul Değiştir


14

Üç girdi, bir metin dizisi alın T; değiştirilecek bir karakter dizisi F; ve bunların yerini alacak bir karakter dizisi R,. İle Taynı (büyük / küçük harfe duyarlı olmayan) karakterlerin her bir alt dizesi için F, bunları içindeki karakterlerle değiştirin R. Ancak, orijinal metinle aynı durumu koruyun.

İçinde daha fazla karakter varsa Rdaha Fgibi bulunmaktadır, ilave karakterler aynı durum olmalıdır R. İçinde rakamlar veya simgeler Fvarsa, karşılık gelen karakterler Rbulundukları kasayı saklamalıdır R. Fmutlaka görünmez T.

Tüm metnin yazdırılabilir ASCII aralığında olacağını varsayabilirsiniz.

Örnekler

"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"

Korumalı alan bağlantısı


Garip muhafaza ile bir örnek talep etmek:"TeXT input", "text", "test"
Mühendis Tost

@EngineerToast Eklenen örnek
Andrew

Neden "The birch canoe slid on the smooth planks", "o", " OH MY "bu kadar komik bulduğumdan emin değilim , ama bu örneği çok sevdim.
Sihirli Ahtapot Urn

Yanıtlar:


3

Retina , 116 bayt

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

Çevrimiçi deneyin! Açıklama:

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

Bu aramalar Tve maçın ileriye karşı büyük / küçük harfe duyarlı olmayan bir Feşleşme olduğunda, bir dizi yeni satır ile çevrelenir ve bunun için ileriye doğru Rda eklenir.

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

Kopyasının her harfi, Reşleşmeyle eşleşecek şekilde ayarlanır, ardından çalışma alanının dışına taşınır, böylece bir sonraki harf işlenecek Rveya eşleşme harf bitene kadar işlenebilir .

¶¶¶¶.*|¶

RHarflerin kopyası tükenirse, maçın geri kalanından önce 4 yeni satır gelecektir, bu yüzden silin. Aksi takdirde, sonuç elde etmek için kalan her şey, kopyaları Rgirdinin eşleşmeyen kısımlarıyla birleştirilmesi gereken kopya parçalarının üzerine bırakılacaktır .


3

APL (Dyalog) , 75 73 72 bayt

İstemleri için T, Rve Fbu sırayla. RDyalog dönüşüm formatında b ve FPCRE formatında verilmelidir.

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

Çevrimiçi deneyin!

 istemek T

 verim (1'i ayırır T)

⍞⎕R()⍠1 İstemi Fve R eplace, aşağıdaki fonksiyonun sonucu ile eşleşir:

⍞∘{…} istendiği Rgibi sol argüman olarak şuna bağlayarak monadic bir işlev türetebilir :

  ≢⍺ içindeki harf sayısını say R

  ⍺⍵.Match↑¨⍨ her birinden bu kadar çok harf al Rve maç
   bağlandığımız sol argüman R.
   içinde Matchbulunan dizeyi içeren bir ad alanıdır .

   bu ikisini iki sıralı bir matrise karıştırın

  d← olarak depola d

  (… Buna )  aşağıdaki örtük işlevini uygulayın:

   819⌶ küçük harf (anımsatıcı: 819 Büyük gibi görünüyor )

   l← bu işlevi şu şekilde depola l

  d≠ Farklı olan Boolean d(yani her küçük / büyük harf için 0/1 verir)

  (… Buna ) aşağıdaki örtük işlevini uygulayın:

   ≠⌿ dikey XOR

   ()∧ Aşağıdaki diziyle Boolean AND:

    l⎕A küçük harfli bir lafabet

    ⎕A,baş  harf A lphabet

    d∊ Bir üye olup olmadığı (örneğin bir harf)

    ⊢⌿ son satır yani bir harf olup olmadığı maç karakteri için

   1∘⌷≠ İlk satırla XOR, yani her karakterinin Rbüyük harf olup olmadığı

  ()l¨⍨ Bunu her bir harfi küçük harfle (0 ise) veya büyük harfle (1 ise) kullanın:

   ⊣⌿ ilk satır, yani R


* Dyalog Classic ⎕OPT yerine bayt sayımı .



2

Geri çekilen. Dom'un cevabı uzun bir vuruşla atıyor.

# Perl 5 , 136 + 1 (-p) = 137 bayt

$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}

Çevrimiçi deneyin!

@Dom Hastings bahsettikten sonra büyük bir kesim yaptı \Q

# Perl 5 , 176 + 1 (-p) = 177 bayt

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}

Çevrimiçi deneyin!


Tüm test senaryolarını şimdi geçiyor;) 108: Çevrimiçi deneyin!
Dom Hastings

Göndermelisiniz. Benimkini biraz yeniyor.
Xcali

Yeterince adil! Bunu yapmak eğlenceliydi. Ben meydan okuma zevk!
Dom Hastings

2

PowerShell , 190 bayt

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]})})

Çevrimiçi deneyin!

Açıklama:

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

Değiştirme scriptblock:

$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

Test senaryoları:

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 bayt

(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))

Geleneksel olarak biçimlendirilmiş orijinal:

(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 bayt

(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``)

Daha az golf:

(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``
)

Programın sembolleri işlemesi gerektiğinden , bu normal ifade çıkış işlevinden 47 bayt geldi . :(


1

Python 2 , 193 200 bayt

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

Çevrimiçi deneyin!


Bu (TIO bağlantısından 193 bayt) dizenin sonunda eşleşme bulamaz.
tehtmi

1

Python 3 , 183 bayt

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)))

Çevrimiçi deneyin!

re.split + tüm çift öğeleri saklayın ve tüm tek öğeleri yeni dizenin doğru dönüştürülmesiyle değiştirin:

>>> 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 bayt

"BrainFriend" testcase için büyük harf ile bir hata düzeltmek için bir bayt eklemek zorunda kaldı

Vay be bu sıkıcıydı ... Şimdi baytlardan uzaklaşmak için

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);}

Çevrimiçi deneyin!


Muhtemelen bariz bir şeyi özlüyorum, ama hemen sonra *(p=f)ayarladığınızda neden ihtiyacınız var p=c=t? Sadece denedim *fve işe yaramadı, bu yüzden hemen üzerine yazılmıyor.
Andrew

f befault tarafından bir int yani biz bir char almak dereference olamaz, ama p bir char *
cleblanc

Ah, bu mantıklı. Yani daha kısa bir yazma yolu *((char*)f)mu? Güzel!
Andrew

1

C # (Mono C # derleyici) , 241 bayt

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)); 
}
}

Çevrimiçi deneyin!


1
PPCG'ye Hoşgeldiniz! Burada biraz boşluk kaldırabilirsiniz ve aslında girdileri argüman veya girdi olarak almanız gerekir (bunları kodlamak yasaktır) veya aslında işlevi dahil edebilirsiniz; Action<string,string,string> r =parçaya bile ihtiyacınız yok
HyperNeutrino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.