2016-09-30 2 views
0

У меня есть следующий текст:Как извлечь эту подстроку в этой строке?

"Showing1-30\nof 1404results" 

То, что я хочу, чтобы вытащить является 1404.

Как это сделать?

Я думал, что буду использовать регулярное выражение для соответствия только строке между словами of и results, но не могу понять, как это сделать.

Или есть другой способ, скажем, встроенный метод Ruby, который я мог бы использовать, что эффективно?

Я также рассматривает возможность использования split, но разнос выключен, так это выглядит следующим образом:

=> ["Showing1-30", "of", "1404results"] 

Как делать то, что я хочу?

+1

Есть ли у вас больше примеров текста для разбора? –

+0

'' Showing1-30 \ nof 1404results ''не слишком читабельна. Вы отвечаете за его создание или, скорее всего, измените его на нечто более читаемое, например «Отображение результатов 1-30 \ nof 1404»? –

ответ

2

Я хотел бы использовать:

"Showing1-30\nof 1404results"[/(\d+)results/, 1] # => "1404" 

"Showing1-30\nof 1404results" не слишком читаемым. Если вы отвечаете за ее получения, или если он может изменить что-то более читаемым, например, "Showing 1-30\nof 1404 results", то простой твик поможет:

"Showing1-30\nof 1404results"[/(\d+)\s*results/, 1] # => "1404" 

где \s* позволит 0, 1 или несколько пробельных символов ,

Держите регулярные выражения настолько простыми, насколько это возможно, пока не доказано, что они должны быть более сложными. По мере увеличения сложности шансы замедления матча увеличиваются, что в цикле может быть резким с длинными строками. Кроме того, шансы добавить дыру, которая приводит к ложным срабатываниям, тоже повышаются, что может быть трудно отлаживать.

+0

Увы, но это регулярное выражение (с «из») уже дано в tw o более ранние ответы, и я также упомянул '\ s *' в своем ответе. –

+0

Это приятная модификация ответа Питера, и я предполагаю, что затронул основной вопрос, который я поднял. Единственный вопрос: если текст исправлен и теперь читается '' Отображение 1 - 30 из 1404 результатов '', будет ли это отображаться' 1404'? – marcamillion

+1

@CarySwoveland, это не заботится о 'of', что несущественно для поиска информации. Только «результаты». –

4

Вы можете просто сделать

["Showing1-30", "of", "1404results"].last.to_i 

Или использовать регулярные выражения, как

/of (\d+)results/ 
+0

Хороший, мускулистый! –

+0

Oooohh ... это умно. Единственное, что кто-то может исправить, так что последняя строка имеет пробел, поэтому целое число теперь будет второй до последней строки. В противном случае мне действительно нравится это предложение. Довольно сексуально. – marcamillion

4

матч «из» следует один или более пробела, за которым следует одна или несколько цифр в захвате 1-е группы, а затем по "результатам", а затем извлечь содержимое группы захвата 1.

"Showing1-30\nof 1404results"[/of\s+(\d+)results/,1] 
    #=> "1404" 

или

матч строка, которая предшествует «из» следует одна пространства (положительный просмотр назад), за которым следует «Результаты» (положительная упреждающие)

"Showing1-30\nof 1404results"[/(?<=of\s)\d+(?=results)/] 
    #=> "1404" 

или

матча «из "следует один или несколько пробелов, забыть все, согласованное до сих пор (\K), матч один или несколько цифр, затем„результаты“(положительный упреждающих)

"Showing1-30\nof 1404results"[/of\s+\K\d+(?=results)/] 
    #=> "1404" 

Это может быть желательно, чтобы изменить первое регулярное выражение

/(?<=of\s)\d+\s*(?=results)/ 

в случае, если кто-то решит «правильно» строка для чтения "Showing 1-30\nof 1404 results"[/(?<=of\s)\d+(?=results)/]. (То же самое для двух других.)

1 Позитивные искажения Ruby не могут быть переменной длины; следовательно, \s+ здесь не разрешается.

+0

Какой хороший синтаксис, я этого не знал. –

+0

@CasimiretHippolyte, я не могу поверить, что вы ничего не знаете о regex's. Вы имели в виду '\ K'? –

+0

Нет, речь шла об этом конкретном синтаксисе ruby: '" string "[/ pattern /, group]', но я редко занимаюсь рубином. –

1

Если позиция этого числа фиксировано, то следующий самый быстрый

"Showing1-30\nof 1404results"[-12..-8] 

[-12..-8] является диапазон, вы можете увидеть строку как массив символов и указать символы между 8 и 12-ю позицию, считая справа, -1 - конец строки, -2 - последний символ и т. д.

В нет, то регулярное выражение как

"Showing1-30\nof 14results"[/ \d+/].strip 

Глядит для пространства с последующим числом, то снимите ведущее пространство. Это проще, чем использование группы захвата.

+0

Вам нужно взять длину, а также позиция, числа фиксирована. Кроме того, поскольку строка начинается с «Showing1-30», мы можем предположить, что это может быть «Showing31-60» или «Showing 31-60», если мы не сделаем второе предположение о том, что нет пробел, предшествующий другим номерам в строке. Кроме того, учитывая, что маркамиллион рассматривает использование строк «из» и «результатов» в качестве якорей, возможно, есть строки, чтобы пропустить форму «Showing1-30 \ nof 1404failures». заключается в том, что для принятия такого подхода необходимы дополнительные предположения. –

+0

К сожалению, позиция номера не может быть исправлена ​​:( Регулярное выражение не обязательно будет работать, потому что нет гарантии, что строка будет идентична этому (т. Е. Она может быть исправлена ​​в будущем для чтения '). Отображение 1 - 30 из 1404 результатов "'), в этот момент это регулярное выражение не работает. Хорошая попытка! – marcamillion

+1

marcamillon, это не была попытка. Это правильно, учитывая некоторые предположения, которые не могут быть оценены из утверждения проблемы. –

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