#c#
#c#
Вопрос:
У меня есть следующая строка:
string text = "1. This is first sentence. 2. This is the second sentence. 3. This is the third sentence. 4. This is the fourth sentence."
Я хочу разделить его в соответствии с 1. 2. 3. и так далее:
result[0] == "This is first sentence."
result[1] == "This is the second sentence."
result[2] == "This is the third sentence."
result[3] == "This is the fourth sentence."
Есть ли какой-либо способ, которым я могу сделать это на C #?
Комментарии:
1. Пожалуйста, объясните: «потому что это не так».
2. Как вы хотели бы разделить следующее
1. First line 2. Second Numbered2. 2. Third Line
3. Я думаю, он имеет в виду, что предложение может переместиться на другую строку. Надеюсь, предложения, по крайней мере, все еще заканчиваются разрывами строк, и в этом случае мы действительно ищем строки, которые начинаются с цифр, за которыми следуют точка и пробел. Но я хочу, чтобы это подтвердилось, прежде чем я дам ответ, и я также хочу знать, хочет ли он сохранить номер предложения.
4. Разделяются ли они возвратом каретки или существует вероятность того, что он будет равен «1. Это первое предложение. 2. Это второе предложение. 3. Это третье предложение.» возможно, вы могли бы разделить ее с помощью регулярных выражений, проверяющих наличие цифр, за которыми следуют десятичные дроби, но это сломалось бы, если бы «3.» было в середине предложения.
5. Я снова обновил свой вопрос.
Ответ №1:
Предполагая, что вы не можете встретить такой шаблон в своих предложениях: X.
(целое число, за которым следует точка, за которой следует пробел), это должно сработать:
String[] result = Regex.Split(text, @"[0-9] . ");
Комментарии:
1. Или вы могли бы использовать @»d . » в качестве вашего шаблона, где d — это ярлык для сопоставления цифры.
2. @Zannjaminderson: на самом деле это не так:
d
соответствует любой цифре в Юникоде ( fileformat.info/info/unicode/category/Nd/list.htm ). Например, этот символ௮
будет разделен, если вы используетеd
, но не будет, если вы используете[0-9]
.3. Спасибо за разъяснение — это интересный момент — не уверен, что в данном случае это будет проблемой, но это стоит понять наверняка.
4. @Zannjaminderson: Я согласен, что эти «специальные» символы (то есть не арабские цифры, к которым мы привыкли) (мягко говоря) довольно редки. Но это позор, что все шпаргалки регулярных выражений указывают на это
d is equivalent to [0-9]
. 🙂5. Согласен, спасибо, что пролили некоторый свет на это. Будь прокляты ваши лживые шпаргалки с регулярными выражениями! Это, безусловно, сделало
d
бы довольно непрочную абстракцию, если бы вы начали сталкиваться со случаями, когда ваше регулярное выражение соответствовало специальным символам, которые вы не предполагали, чтобы они соответствовали…
Ответ №2:
возможно ли, что в предложении тоже будут числа?
Поскольку я не знаю, как вы форматируете, вы уже сказали, что не можете выполнить в EOL / новой строке, я бы попробовал что-то вроде…
List<string> lines = new List<string>();
string buffer = "";
int count = 1;
foreach(char c in input)
{
if(c.ToString() == count.ToString())
{
if(!string.IsNullOrEmpty(buffer))
{
lines.Add(buffer);
buffer = "";
}
count ;
}
buffer = c;
}
//lines will now contain your splitted data
Затем вы можете получить доступ к каждому предложению следующим образом…
string s1 = lines[0];
string s2 = lines[1];
string s3 = lines[2];
Важно: убедитесь, что вы проверили количество строк, прежде чем получать подобное предложение…
string s1 = lines.Count > 0 ? lines[0] : "";
Это делает большое предположение, что у вас не будет идентификатора номера следующей строки в данном предложении (т. Е. Предложение 2 не будет содержать номер 3)
Если это не поможет, предоставьте вам ввод в исходном формате (не добавляйте разрывы строк, если их нет)
РЕДАКТИРОВАТЬ: исправлен мой код (извините, неправильная переменная)
Комментарии:
1. Уважаемый, я не могу понять вашу логику. Все, что я хочу, это что-то вроде: string1 = 1. Это первое предложение, string2 = 2. Это второе предложение и так далее.
2. @fawad, см. раздел Редактирование, чтобы узнать, как вы можете получить доступ к каждому предложению после функции
Ответ №3:
int index = 1;
String[] result = Regex.Split(text, @"[0-9] . ").Where(i => !string.IsNullOrEmpty(i)).Select(i => (index ).ToString() ". " i).ToArray();
результат будет содержать ваши предложения, включая «номер строки».
Ответ №4:
Вы можете разделить символ ‘.’ и удалить все, что меньше 2 символов, из результирующего массива.
Конечно, это зависит от того факта, что у вас не было бы точек данных из 1 символа, отличных от числового индикатора, если бы это было так, вы также могли бы проверить его как числовое значение.
Этот ответ также удалит точку из ваших предложений, поэтому вам придется добавить ее обратно. Существует много манипуляций, но это избавляет вас от необходимости читать каждый символ и решать его независимо.
Ответ №5:
Это самый простой способ:
var str = "1. This is first sentence."
"2. This is the second sentence."
"3. This is the third sentence."
"n. This is the nenth sentence";
//set your max number e.g 10000
var num = Enumerable.Range(1, 10000).Select(x=>x.ToString() ".").ToArray();
var res=str.Split(num ,StringSplitOptions.RemoveEmptyEntries);
Надеюсь, это поможет 😉
Комментарии:
1. Я не всегда создаю массив, но когда я это делаю, я создаю его как минимум из 10000 элементов.