Вам на самом деле не нужно регулярное выражение, чтобы решить это. Используйте старые добрые string.Split()
и имена процессов
var input = "Jeff, john45, ab, cd, peter-ivanov, @smith, sh, too_long_username, !lleg@l ch@rs, jeffbutt";
var listOfNames = input.Split(new[] {",", " "}, StringSplitOptions.RemoveEmptyEntries)
.Where(l => l.Length >= 3 && l.Length <= 18) // filter by length
.Where(l => l.All(c => char.IsDigit(c) || char.IsLetter(c) || c == '-')) // filter by spec chars
.ToList();
, теперь у вас есть список из четырех имен. Если вы хотите превратить его обратно в строку, просто объедините ваши имена:
var singleLine = string.Join(", ", listOfNames);
// singleLine is "Jeff, john45, peter-ivanov, jeffbutt"
Возврат константы и является разумной вещью сделать при многих обстоятельствах, особенно если возвращаемый объект является большим или не может быть скопирован.
Относительно const_cast помните, что "частный" спецификатор доступа в C++ там как помощь программисту - это не предназначается, чтобы быть мерами безопасности. Если кто-то хочет получить доступ к членам парламента, не занимающим официального поста объекта, это может получить их, независимо от того, что Вы пытаетесь сделать для предотвращения его.
Да целый время жизни ссылки не превышает время жизни объекта, который возвратил ее. Если необходимо подвергнуть члена парламента, не занимающего официального поста, Вы не хотите измененный, это - хороший способ сделать так. Это не является надежным, но это - один из лучших способов сделать так в C++
Да и нет ничего, что можно сделать для предотвращения этого. Нет никакого способа препятствовать тому, чтобы кто-то выбросил константу в C++ в любое время. Это - ограничение / функция C++.
В целом, хотя, необходимо отметить каждое использование const_cast как ошибка, если это не содержит достаточно подробный комментарий относительно того, почему это необходимо.
const int &ref = your_object.your_function();
*(int*)&ref = 1234;
Не волнуйтесь о пользователях, делающих const_casts только для повреждения инвариантов. Если они действительно хотят взломать Ваш код, они могут без Вас предоставляющий средства доступа Вашим внутренним атрибутам. Путем возврата постоянной ссылки обычный пользователь по ошибке не изменит данные.
Инкапсуляция предотвращает ошибки, не шпионаж злонамеренный кодер может повредить ее так или иначе, если они действительно заботятся и знают среду (компилятор). Мыс константы потерян в процессе компиляции (во всех компиляторах, которые я знаю). После того как единица компиляции преобразовывается в двоичные объекты, те объекты не знают о мысе константы, и это может быть использовано для извлечения выгоды.
// a.h
class A
{
public:
A( int a ) : data_( a ) {}
int get() const { return data_; }
private:
int data_;
};
// malicious.h
class A;
void change( A& a, int new_value );
// malicious.cpp
// does not include a.h, but redefines an almost exact copy of it
class A {
public:
A( int a ) : data_( a ) {}
int get() const { return data_; }
int data_; // private removed
};
void change( A& a, int new_value )
{
a.data_ = new_value;
}
// main.cpp
#include "a.h"
#include "malicious.h"
int main()
{
A a(0);
change( a, 10 );
std::cout << a.get() << std::endl; // 10
}
В то время как код выше является неправильным (Одно правило определения нарушено, существует два определения для класса A), факт - то, что с большинством компиляторов определение A и malitious A двоичное совместимый. Код скомпилирует и свяжется, и результат состоит в том, что внешний код имеет доступ к Вашим частным атрибутам.
Теперь, когда Вы знаете о нем, не делайте этого. Это позже будет боль обслуживания в ***. Это стоило Microsoft довольно мало деньги в обеспечении назад совместимости к программному обеспечению, которое использовало половые органы возвращенных объектов API (новые версии API, который совместно использовал тот же открытый интерфейс, но изменился, внутренности взломают некоторый код приложения сторонних производителей). С некоторым широко доступным программным обеспечением поставщик (Microsoft в этом случае) пройдет боль обеспечения назад совместимости, но с менее известными приложениями они не будут, и внезапно Ваше ранее запущенное приложение перестанет работать во всем виде путей.
const_cast может определенно использоваться для получения полного доступа к участнику. Я предполагаю, что Вы не можете остановить людей, если они одержимы стрельбой themself на ноге. Если член парламента, не занимающий официального поста не тяжел, рассмотрите возврат копии той переменной.
Я думаю, что это был Herb Sutter, который когда-то сказал, что нужно "Защитить от Murphy, не от Machiavelli". Таким образом, необходимо сделать все возможное для защиты от кода, используемого неправильно случайно, но нет ничего, что можно сделать о людях, злоупотребляющих кодом нарочно.
Если кто-то действительно хочет взломать Ваш код, они могут, даже если это #define private public
прежде включая Ваш заголовок (и таким образом создание нарушения ODR, но я отступаю).
Таким образом да, пасование назад константы касательно прекрасно.
Да, таким образом, это, вероятно, не, что Вы хотите сделать. С другой стороны, если кто-то идет в проблему константы, бросая Вашу ссылку, возможно, что они действительно знают то, что они делают.
Возможно получить полный доступ. Но что для?
Не забывайте делать средство доступа, чтобы быть корректной константой
const MyType& getMyValue() const;
Также можно ввести Вас частное значение в обратном вызове.
void doJob( callback c )
{
c( myPrivateValue_ );
}