2016-06-14 5 views
0

У меня есть текст, похожий на:Regex - заменить один символ после строки в Скале

"ciao cos? come stai??" 

И я хочу, чтобы заменить (в Scala с использованием Regex) только один знак вопроса после того, как последовательность символов (т.е. [a-zA-Z0-9]) с другим символом. Итак, в предыдущем примере, если мы предполагаем, что я хочу заменить «?» с «_», то результат должен быть:

"ciao cos_ come stai_?" 

Edit: Да, я пытался какое-то решение найдено и на SO, как это в этом link. В Scala я попробовал:

val text = "some? ??" 
val regex = "/([a-zA-Z0-9])?/".r 
val text11 =regex.replaceAllIn(text, "_") 

Но также:

val text = "some? ??" 
val regex = "/([a-zA-Z0-9])?([a-zA-Z0-9])/".r 
val text11 =regex.replaceAllIn(text, "_") 

и оригинальный один отвечал в предыдущей ссылке с другой строкой на входе, но он не работает.

Благодаря

+0

Wait ждать. Что вы пробовали? – nicael

+0

Это не «написать код моей спецификации на бесплатный сайт». Возможно, вам повезло на freelancer.com – Dima

+0

@ Daniele Пожалуйста, покажите нам какой-то код, который вы должны увидеть, что блокирует вас. Вы проверили метод replaceAll? –

ответ

0

Я не знаю, о Скале, но после некоторых исследований мне удалось создать что-то для вас.

Здесь регулярное выражение, если вы хотите иметь дело только с английскими символами

val str = "ciao cos? come stai??".replaceAll("""((?i)[A-Z]+)\?""", "$1_"); 

Пояснение:

  • (?i): Средства к регистру.
  • [A-Z]+: Один или несколько английского письмо
  • (): Захват группа
  • ((?i)[A-Z]+): захватить один или более буквы английского алфавита (независимо от конкретного случая)
  • (\?): '?' Capture буквального характера во второй группе (ее нужно экранировать с помощью обратного слэша, потому что знак вопроса имеет особое значение в регулярном выражении).
  • ((?i)[A-Z]+)\?: Захватите как можно больше букв в первой группе захвата, а затем знак вопроса, захваченный второй группой захвата.

  • $1: Поместите содержимое первой группы захвата

  • $1_: Поместите содержимое первой группы захвата с последующим подчеркиванием. Значок вопроса исчезнет.

Чтобы справиться с любыми буквами из любых языков (на примере французской буквы «Е» вы можете использовать это:

val str = "j'aime le karaté?".replaceAll("""(\p{L}+)\?""", "$1_"); 
  • \p{L}: Это стенд для любого Юникода буквы в любом случае.

Я использовал этот сайт, чтобы проверить регулярные выражения:

http://www.tryscala.com/

+0

Вам не нужно записывать '?', Поскольку вы собираетесь его заменить. –

+0

@ Wiktor Stribiżew Что вы действительно оценили мой ответ за такую ​​маленькую деталь? –

+1

Видите, я могу его продвинуть. На самом деле, я даже отказался от вопроса о нижнем правом/закрытом голосовании. –

Смежные вопросы