only - regex matches c#
Encuentra y extrae un nĂºmero de una cadena (27)
Ahmad Mageed proporciona un enfoque interesante, utiliza Regex y stringbuilder para extraer los enteros en el orden en que aparecen en la cadena.
Un ejemplo de uso de Regex.Split basado en la publicación de Ahmad Mageed es el siguiente:
var dateText = "MARCH-14-Tue";
string splitPattern = @"[^/d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;
int.TryParse(finalresult, out DayDateInt);
Tengo un requisito para encontrar y extraer un número contenido dentro de una cadena.
Por ejemplo, de estas cadenas:
string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"
¿Cómo puedo hacer esto?
Aquí está mi algoritmo
//compatible C# and JAVA
public static int GetNumber(string Text)
{
int val = 0;
for(int i = 0; i < Text.Length; i++)
{
char c = Text[i];
if (c >= ''0'' && c <= ''9'')
{
val *= 10;
//(ASCII code reference)
val += c - 48;
}
}
return val;
}
Aquí hay otro enfoque de Linq
que extrae el primer número de una cadena.
string input = "123 foo 456";
int result = 0;
bool success = int.TryParse(new string(input
.SkipWhile(x => !char.IsDigit(x))
.TakeWhile(x => char.IsDigit(x))
.ToArray()), out result);
Ejemplos:
string input = "123 foo 456"; // 123
string input = "foo 456"; // 456
string input = "123 foo"; // 123
Aquí hay una versión de Linq
:
string s = "123iuow45ss";
var getNumbers = (from t in s
where char.IsDigit(t)
select t).ToArray();
Console.WriteLine(new string(getNumbers));
Así es como limpio los números de teléfono para obtener solo los dígitos:
string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
Basado en la última muestra he creado un método:
private string GetNumberFromString(string sLongString, int iLimitNumbers)
{
string sReturn = "NA";
int iNumbersCounter = 0;
int iCharCounter = 0;
string sAlphaChars = string.Empty;
string sNumbers = string.Empty;
foreach (char str in sLongString)
{
if (char.IsDigit(str))
{
sNumbers += str.ToString();
iNumbersCounter++;
if (iNumbersCounter == iLimitNumbers)
{
return sReturn = sNumbers;
}
}
else
{
sAlphaChars += str.ToString();
iCharCounter++;
// reset the counter
iNumbersCounter = 0;
}
}
return sReturn;
}
El reverso de una de las respuestas a esta pregunta: ¿Cómo eliminar números de una cadena usando Regex.Replace?
// Pull out only the numbers from the string using LINQ
var numbersFromString = new String(input.Where(x => x >= ''0'' && x <= ''9'').ToArray());
var numericVal = Int32.Parse(numbersFromString);
La pregunta no indica explícitamente que solo quieres los caracteres del 0 al 9, pero no sería exagerado creer que esto es cierto en tu ejemplo de conjunto y comentarios. Así que aquí está el código que hace eso.
string digitsOnly = String.Empty;
foreach (char c in s)
{
// Do not use IsDigit as it will include more than the characters 0 through to 9
if (c >= ''0'' && c <= ''9'') digitsOnly += c;
}
¿Por qué no quiere usar Char.IsDigit ()? Los números incluyen caracteres como fracciones, subíndices, superíndices, números romanos, numeradores de moneda, números encerrados en un círculo y dígitos específicos del script.
Lo que uso para obtener números de teléfono sin ninguna puntuación ...
var phone = "(787) 763-6511";
string.Join("", phone.ToCharArray().Where(Char.IsDigit));
// result: 7877636511
Método de extensión para obtener todos los números positivos contenidos en una cadena:
public static List<long> Numbers(this string str)
{
var nums = new List<long>();
var start = -1;
for (int i = 0; i < str.Length; i++)
{
if (start < 0 && Char.IsDigit(str[i]))
{
start = i;
}
else if (start >= 0 && !Char.IsDigit(str[i]))
{
nums.Add(long.Parse(str.Substring(start, i - start)));
start = -1;
}
}
if (start >= 0)
nums.Add(long.Parse(str.Substring(start, str.Length - start)));
return nums;
}
Si también desea números negativos, simplemente modifique este código para controlar el signo menos ( -
)
Dada esta entrada:
"I was born in 1989, 27 years ago from now (2016)"
La lista de números resultantes será:
[1989, 27, 2016]
Otra solución simple usando Regex. Debería usar este
using System.Text.RegularExpressions;
y el código es
string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"/d", "");
string mynumber = Regex.Replace(var, @"/D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
Para aquellos que quieren un número decimal de una cadena con Regex en DOS líneas:
decimal result = 0;
decimal.TryParse(Regex.Match(s, @"/d+").Value, out result);
Lo mismo aplica para flotar , largo , etc ...
Puedes hacer esto usando String
propiedad String
como a continuación:
return new String(input.Where(Char.IsDigit).ToArray());
que da solo el número de la cadena.
Regex.Split puede extraer números de cadenas. Obtienes todos los números que se encuentran en una cadena.
string input = "There are 4 numbers in this string: 40, 30, and 10.";
// Split on one or more non-digit characters.
string[] numbers = Regex.Split(input, @"/D+");
foreach (string value in numbers)
{
if (!string.IsNullOrEmpty(value))
{
int i = int.Parse(value);
Console.WriteLine("Number: {0}", i);
}
}
Salida:
Número: 4 Número: 40 Número: 30 Número: 10
Solo usa un RegEx para que coincida con la cadena, luego convierte:
Match match = Regex.Match(test , @"(/d+)");
if (match.Success) {
return int.Parse(match.Groups[1].Value);
}
Tendrás que usar Regex como /d+
/d
coincide con los dígitos en la cadena dada.
aquí está mi solución
string var = "Hello345wor705Ld";
string alpha = string.Empty;
string numer = string.Empty;
foreach (char str in var)
{
if (char.IsDigit(str))
numer += str.ToString();
else
alpha += str.ToString();
}
Console.WriteLine("String is: " + alpha);
Console.WriteLine("Numeric character is: " + numer);
Console.Read();
ir a través de la cadena y utilizar Char.IsDigit
string a = "str123";
string b = string.Empty;
int val;
for (int i=0; i< a.Length; i++)
{
if (Char.IsDigit(a[i]))
b += a[i];
}
if (b.Length>0)
val = int.Parse(b);
también puedes probar esto
string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^//d]"));
usar expresiones regulares ...
Regex re = new Regex(@"/d+");
Match m = re.Match("test 66");
if (m.Success)
{
Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString()));
}
else
{
Console.WriteLine("You didn''t enter a string containing a number!");
}
/d+
es la expresión regular para un número entero. Asi que
//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"/d+").Value;
devuelve una cadena que contiene la primera aparición de un número en subjectString
.
Int32.Parse(resultString)
le dará el número.
string verificationCode ="dmdsnjds5344gfgk65585";
string code = "";
Regex r1 = new Regex("//d+");
Match m1 = r1.Match(verificationCode);
while (m1.Success)
{
code += m1.Value;
m1 = m1.NextMatch();
}
string input = "Hello 20, I am 30 and he is 40";
var numbers = Regex.Matches(input, @"/d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();
static string GetdigitFromString(string str)
{
char[] refArray = { ''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'' };
char[] inputArray = str.ToCharArray();
string ext = string.Empty;
foreach (char item in inputArray)
{
if (refArray.Contains(item))
{
ext += item.ToString();
}
}
return ext;
}
string s = "kg g L000145.50/r/n";
char theCharacter = ''.'';
var getNumbers = (from t in s
where char.IsDigit(t) || t.Equals(theCharacter)
select t).ToArray();
var _str = string.Empty;
foreach (var item in getNumbers)
{
_str += item.ToString();
}
double _dou = Convert.ToDouble(_str);
MessageBox.Show(_dou.ToString("#,##0.00"));
var match=Regex.Match(@"a99b",@"/d+");
if(match.Success)
{
int val;
if(int.TryParse(match.Value,out val))
{
//val is set
}
}
var outputString = String.Join("", inputString.Where(Char.IsDigit));
Obtener todos los números en la cadena. Así que si usas para el ejemplo ''1 más 2'' obtendrá ''12''.