2012-04-19 3 views
0

Мое текущее регулярное сражение заменяет все запятые перед номером в строке. Регулярное выражение должно игнорировать все следующие запятые. Я натягивал около рубля в течение часа и, похоже, не мог заставить что-то работать.Регулярные выражения с lookahead в Ruby

Test Строка ...

'this is, a , sentence33 Here, is another.' 

Желаемая выход ...

'this is comma a comma sentence33 Here, is another.' 

Так что-то вдоль линий ...

testString.gsub(/\,*\d\d/,"comma") 

Чтобы дать Вам некоторый фон, Я делаю небольшой соскабливающий побочный проект. Элементы, которые я собираю, в основном разделены запятыми, начиная с двухзначного возраста. Однако иногда theres заголовок предшествует возрасту, который может содержать запятые. Чтобы сохранить структуру, которую я установил позже, мне нужно заменить запятые в заголовке.

Попробовав ОТВЕТ Stack Overflow'S ...

я все еще возникают некоторые проблемы. Не смейтесь, но вот фактическая линия от экрана выскабливание Thats вызывают проблемы ...

statsString =  "    23, 5'9\", 140lb, 29w,      Slim,     Brown  Hair,    Shaved Body,    White, Looking for  Friendship, 1-on-1 Sex, Relationship. Out  Yes,SmokeNo,DrinkNo,DrugsNo,ZodiacCancer.  Versatile,     7.5\"     Cut, Safe Sex Only,  HIV  Negative, Prefer meeting at:Public Place.     PerformerContact xxxxxx87             This user has TURNED OFF his IM          Send Smile  Write xxxxxx87 a message:" 

Во-первых, чтобы все эти фрагменты я добавить «XX» так, что моя фильтрация запятой будет работать во всех случаях, те, с текстом и без него. Далее следует фактическое исправление. Выход ниже ...

statsString = 'xx, ' + statsString 

statsString = statsString.gsub(/\,(?=.*\d)/, 'comma'); 

=> "xxcomma    23comma 5'9\"comma 140lbcomma 29wcomma      Slimcomma     Brown  Haircomma    Shaved Bodycomma    Whitecomma Looking for  Friendshipcomma 1-on-1 Sexcomma Relationship. Out  YescommaSmokeNocommaDrinkNocommaDrugsNocommaZodiacCancer.  Versatilecomma     7.5\"     Cutcomma Safe Sex Onlycomma  HIV  Negativecomma Prefer meeting at:Public Place.     PerformerContact xxxxx87             This user has TURNED OFF his IM          Send Smile  Write xxxxxxx87 a message:" 
+2

Почему не запятая после 'Here' заменить? Потому что 'Here' начинается с заглавной буквы? Вам нужно предоставить более подробную информацию о ваших требованиях. И, возможно, еще несколько примеров ввода и желаемого вывода. Вы говорите «замена запятых перед номером», но это не то, что делает ваш пример. – alan

+0

Выполнение этого в одном регулярном выражении кажется обреченным на провал; это проблема домашней работы, которая должна быть решена таким образом или вы просто пытаетесь решить проблему и застряли в мышлении, что regexp - лучший способ ее решить? – sarnold

+0

Просто добавьте некоторую справочную информацию в вопрос. Спасибо за ответ. –

ответ

2

Код:

testString = 'this is, a , sentence33 Here, is another.'; 
result = testString.gsub(/\,(?=.*\d)/, 'comma'); 
print result; 

Выход:

this iscomma a comma sentence33 Here, is another.

Тест:

http://ideone.com/9nt1b

+0

@ user1306973 - Вы находитесь на коде выше, что вы ищете? –

+0

Если вы уверены, что число (минимум) 2 цифры, вы можете заменить '\ d' на' \ d \ d' в регулярном выражении. Но с '\ d' он будет делать то, что вы задаете в вопросе, независимо от количества цифр такого числа. –

+0

Большое спасибо. Это сделал трюк. Единственная проблема теперь - это условная логика. Когда заголовок, предшествующий двум цифрам, отсутствует, регулярное выражение искажает все запятые, которые мне нужны downsetram. Я могу попробовать testString.gsub (/^\, (? =. * \ D) /, 'comma'); или что-то подобное –

1

Не так мало, но, кажется, решить задачу:

str = 'this is, a , sentence33 Here, is another.' 

str = str.match(/(.*)(\d+.*)/) do 

    before = $1 
    tail = $2 

    before.gsub(/,/, 'comma') + tail 
end 

print str 
+0

Спасибо, Ваче. Я новичок в stackoverflow. – parallelgeek

+0

Чтобы проверить, соответствует ли * something * совпадение, вам нужно использовать '(? = X)', где 'X' - это то, что должно следовать за совпадением - так что в этом случае это ничего или ничего'. * 'С цифрой' \ d', поэтому '(? =. * \ d)', Добро пожаловать в Stackoverflow. –