Wyodrębnij podłańcuch z ciągu znaków w Ruby za pomocą wyrażenia regularnego

Jak mogę wyodrębnić podłańcuch z ciągu znaków w Ruby?

Przykład:

String1 = "<name> <substring>"

Chcę wyodrębnić substring z String1 (tj. wszystko w ramach ostatniego wystąpienia < i >).

Author: Alan W. Smith, 2010-11-06

5 answers

String1.scan(/<([^>]*)>/).last.first

scan tworzy tablicę, która dla każdego <item> w String1 zawiera tekst pomiędzy < i > w jednoelementowej tablicy (ponieważ gdy jest używana z wyrażeniami regularnymi zawierającymi grupy przechwytywania, scan tworzy tablicę zawierającą przechwytywania dla każdego dopasowania). last daje ci ostatnią z tych tablic, a first następnie daje Ci łańcuch w niej.

 98
Author: sepp2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 16:43:31
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

Nie trzeba używać scan, jeśli potrzebujemy tylko jednego wyniku.
Nie trzeba używać match, gdy mamy String[regexp,#].

Zobacz: http://ruby-doc.org/core/String.html#method-i-5B-5D

Uwaga: str[regexp, capture] → new_str or nil

 258
Author: Nakilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-12 02:56:44

Możesz użyć do tego dość łatwo wyrażenia regularnego ...

Zezwalając na spacje wokół słowa (ale nie zachowując ich):

str.match(/< ?([^>]+) ?>\Z/)[1]

Lub bez dozwolonych spacji:

str.match(/<([^>]+)>\Z/)[1]
 18
Author: coreyward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 07:57:05

Oto nieco bardziej elastyczne podejście przy użyciu metody match. Dzięki temu możesz wyodrębnić więcej niż jeden ciąg znaków:

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"
 9
Author: Grant Birchmeier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 19:04:02

Prostszym skanem byłoby:

String1.scan(/<(\S+)>/).last
 2
Author: Navid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-08 15:52:23