c# - separacion - impedir que se dividan las palabras entre líneas power point
¿Cómo dividir el texto en palabras? (6)
Dividir texto en espacios en blanco, luego recortar puntuación.
var text = "''Oh, you can''t help that,'' said the Cat: ''we''re all mad here. I''m mad. You''re mad.''";
var punctuation = text.Where(Char.IsPunctuation).Distinct().ToArray();
var words = text.Split().Select(x => x.Trim(punctuation));
Está de acuerdo exactamente con el ejemplo.
¿Cómo dividir el texto en palabras?
Texto de ejemplo:
''Oh, no puedes evitarlo'', dijo el Gato: ''todos estamos locos aquí. Estoy loco. Estas loco.''
Las palabras en esa línea son:
- Oh
- tú
- hipocresía
- ayuda
- ese
- dijo
- la
- Gato
- fueron
- todos
- enojado
- aquí
- soy
- enojado
- Tu eres
- enojado
Este es uno de solución, no uso ninguna clase de ayuda o método.
public static List<string> ExtractChars(string inputString) {
var result = new List<string>();
int startIndex = -1;
for (int i = 0; i < inputString.Length; i++) {
var character = inputString[i];
if ((character >= ''a'' && character <= ''z'') ||
(character >= ''A'' && character <= ''Z'')) {
if (startIndex == -1) {
startIndex = i;
}
if (i == inputString.Length - 1) {
result.Add(GetString(inputString, startIndex, i));
}
continue;
}
if (startIndex != -1) {
result.Add(GetString(inputString, startIndex, i - 1));
startIndex = -1;
}
}
return result;
}
public static string GetString(string inputString, int startIndex, int endIndex) {
string result = "";
for (int i = startIndex; i <= endIndex; i++) {
result += inputString[i];
}
return result;
}
Primero, remueve todos los caracteres especiales:
var fixedInput = Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty);
// This regex doesn''t support apostrophe so the extension method is better
Luego dividirlo:
var splitted = fixedInput.Split('' '');
Para una solución de C # más simple para eliminar caracteres especiales (que puede cambiar fácilmente), agregue este método de extensión (agregué un soporte para un apóstrofe):
public static string RemoveSpecialCharacters(this string str) {
StringBuilder sb = new StringBuilder();
foreach (char c in str) {
if ((c >= ''0'' && c <= ''9'') || (c >= ''A'' && c <= ''Z'') || (c >= ''a'' && c <= ''z'') || c == ''/''') {
sb.Append(c);
}
}
return sb.ToString();
}
Entonces utilízalo así:
var words = input.RemoveSpecialCharacters().Split('' '');
Se sorprenderá al saber que este método de extensión es muy eficiente (seguramente mucho más eficiente que el Regex), así que le sugeriré que lo use;)
Actualizar
Estoy de acuerdo en que este es un enfoque solo en inglés, pero para hacerlo compatible con Unicode, todo lo que tiene que hacer es reemplazar:
(c >= ''A'' && c <= ''Z'') || (c >= ''a'' && c <= ''z'')
Con:
char.IsLetter(c)
Que admite Unicode, .Net también le ofrece char.IsSymbol
y char.IsLetterOrDigit
para la variedad de casos
Puede intentar usar una expresión regular para eliminar los apóstrofes que no están rodeados por letras (es decir, comillas simples) y luego usar los métodos estáticos Char
para eliminar todos los demás caracteres. Al llamar primero a la expresión regular, puede mantener los apóstrofes de contracción (por ejemplo can''t
) pero eliminar las comillas simples como en ''Oh
.
string myText = "''Oh, you can''t help that,'' said the Cat: ''we''re all mad here. I''m mad. You''re mad.''";
Regex reg = new Regex("/b[/"'']/b");
myText = reg.Replace(myText, "");
string[] listOfWords = RemoveCharacters(myText);
public string[] RemoveCharacters(string input)
{
StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
if (Char.IsLetter(c) || Char.IsWhiteSpace(c) || c == ''/''')
sb.Append(c);
}
return sb.ToString().Split('' '');
}
Si no desea utilizar un objeto Regex, podría hacer algo como ...
string mystring="Oh, you can''t help that,'' said the Cat: ''we''re all mad here. I''m mad. You''re mad.";
List<string> words=mystring.Replace(",","").Replace(":","").Replace(".","").Split(" ").ToList();
Aún tendrás que manejar el apóstrofe al final de "eso".
Solo para agregar una variación en la respuesta de @Adam Fridental que es muy buena, puedes probar este Regex:
var text = "''Oh, you can''t help that,'' said the Cat: ''we''re all mad here. I''m mad. You''re mad.''";
var matches = Regex.Matches(text, @"/w+[^/s]*/w+|/w");
foreach (Match match in matches) {
var word = match.Value;
}
Creo que este es el RegEx más corto que tendrá todas las palabras
/w+[^/s]*/w+|/w