грешка „невалиден регулярен изразпричина „Завършваща обратна наклонена черта““ с gsub в R

Получавам съобщение за грешка, докато заменям текст в R.

 x
 [1] "Easy bruising and bleeding.\\"

gsub(as.character(x), "\\", "")
Error in gsub(as.character(x), "\\", "") : 
   invalid regular expression 'Easy bruising and bleeding.\', reason 'Trailing backslash'

person Manish    schedule 31.03.2014    source източник


Отговори (2)


AboutUsViewController *About =[[AboutUsViewController alloc] initWithNibName:@AboutUsViewController bundle:nil]; [self.navigationController pushViewController:About animated:YES]; [Относно освобождаването];
person Roland    schedule 31.03.2014
comment
Как да направите това без fixed = TRUE, например съвпадение \ като част от по-голям регулярен израз? - person Josh; 10.12.2018
comment
Обикновено добавям обратни наклонени черти, докато има достатъчно екрани. - person Roland; 10.12.2018
comment
хах! Това определено работи. В крайна сметка разбрах, че имате нужда от 4 \ s в първия аргумент на gsub, за да съответствате на 1 литерал \ в низа (третият аргумент). Ще публикувам това, което научих като отговор. - person Josh; 11.12.2018

tl;dr: Имате нужда от 4 \s (т.е. \\\\) в първия аргумент на gsub, за да намерите един литерал \ в третия аргумент на gsub. Цялостният процес е:

  • gsub получава \\\\, предава \\
  • regex получава \\, търси \.

За да избегнете fixed = TRUE, което изключва извършването на по-сложни търсения, вашият код трябва да бъде:

> gsub( "\\\\", "", "Easy bruising and bleeding.\\")
[1] "Easy bruising and bleeding."

Обяснение: Причината, поради която се нуждаете от 4 \ е, че \ е специален знак за механизма за регулярни изрази, така че за да може механизмът за регулярен израз да намери литерал \, той трябва да бъде предаден \\; първият \ показва, че вторият \ не е специален знак, а \, който трябва да бъде съпоставен буквално. Така регулярният израз получава \\ и търси \ в низа.

\ също е специален знак за R, така че, за да може gsub да предаде \\ на механизма за регулярни изрази, gsub трябва да получи \\\\. Първото \ показва, че второто \ е литерал \, а не специален знак; третият \ прави същото за четвъртия \. Така gsub получава \\\\ и предава \\ на механизма за регулярни изрази.

Отново цялостният процес е: gsub получава \\\\, предава \\; regex получава \\, търси \.

Забележка: докато низът, който ни предоставихте, се отпечатва на екрана като "Easy bruising and bleeding.\\", низът всъщност е Easy bruising and bleeding.\. Първото \ всъщност е просто бягство за второто \. Можете да потвърдите това с този код:

> cat("Easy bruising and bleeding.\\")
Easy bruising and bleeding.\

Ето защо кодът, който предлагам, има 4 \s, а не 8 \s.

person Josh    schedule 11.12.2018