В C ++ 11 вы можете использовать объемные перечисления , чтобы исправить это. Это удалит имена из глобальной области видимости и поместит их в имя перечисления.
enum class Identity
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED =3
};
enum class Status
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED =3
};
int main ()
{
Identity::UNKNOWN;
Status::UNKNOW;
}
Живой пример kbd>
Ваш код в значительной степени похож на Ruby. Если вы не хотите использовать глобальный $ 1
, вы можете использовать версию с двумя аргументами String # []
:
match = text[/your username is: (.*)/, 1]
Не уверен, что это больше Ruby'ish , но другой вариант:
>> text = "hello john\nyour username is: jj\nthanks for signing up\n"
>> text.match(/your username is: (.*)/)[1]
=> "jj"
Команда split невероятно полезна. Он делит строку на массив подстрок, разделяя все, что вы передаете. Если вы не дадите ей никаких аргументов, она разбивается на пробелы. Итак, если вы знаете, что слово, которое вы ищете, является пятым «словом» (разделение на пробелы и символ возврата), вы можете сделать это:
text = "hello john \ nваше имя пользователя: jj \ nспасибо за регистрация \ n "
match = text.split [5]
.. но, возможно, это недостаточно самодокументируется, или вы хотите разрешить совпадения из нескольких слов. Вместо этого вы можете сделать это:
midline = text.split ("\ n") [1]
match = midline.split ("username is:") .last
Или, возможно, более кратко:
match = text [/ username is: (. *) /, 1]
There's also Regexp#match
, which returns a MatchData
object, which has all the information you could possibly want.
irb> match = /your username is: (.*)/.match "hello john\nyour username is: jj\nthanks for signing up\n"
#=> #<MatchData:0x557f94>
irb> match.pre_match
#=> "hello john\n"
irb> match.post_match
#=> "\nthanks for signing up\n"
irb> match[0]
#=> "your username is: jj"
irb> match[1]
#=> "jj"