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 >
).
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.
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
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]
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"
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
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