我需要使用正则表达式来保留字符串的最后4个字符。我不知道字符串的长度,所以我需要从头开始并倒数。该程序是用c#编写的。
下面是两个示例字符串:
840057
1002945
我需要结果为(最后4个字符):
0057
2945
我的原始代码行使用Regex.Replace,但是我找不到正则表达式,如下面的注释所示。
replacementVal = Regex.Replace(replacementVal, wildcard.Regex, wildcard.RegexReplaceBy);
我将代码切换为使用Regex.Match,然后正则表达式(?s)[0-9]{4}$
正常运行(见下文):
replacementVal = Regex.Replace(replacementVal, wildcard.Regex, wildcard.RegexReplaceBy);
但是使用Regex.Match会破坏我使用的其他正则表达式,例如,我使用^(.).*
来检索名称的首字母。使用Regex.Replace时此方法有效,但使用Regex.Match时失败。
下面是我的代码,请注意包含Regex.Replace的原始行已被注释掉。
为什么Regex.Match使用一个表达式,而Regex.Replace使用另一个表达式?
/// Replaces a wildcard in a string
/// </summary>
/// <param name="str">The string for which to replace the wildcards</param>
/// <param name="row">The DataRow in which the string exists</param>
/// <param name="wildcard">The wildcard to replace</param>
/// <returns>The string with the wildcard replaced</returns>
private static string ReplaceWildcardInString(string str, DataRow row, Wildcard wildcard)
{
// If the string is null or empty, return it as is
if (string.IsNullOrEmpty(str))
return str;
// This will hold the replacement value
var replacementVal = string.Empty;
// If the replacement column value is not empty
if (!row.IsDBNullOrNull(wildcard.ReplaceByColumnName))
{
// Convert its value to string
replacementVal = row[wildcard.ReplaceByColumnName].ToString();
// Apply wildcard regex if given
if (!string.IsNullOrEmpty(wildcard.Regex) && wildcard.RegexReplaceBy != null)
//replacementVal = Regex.Replace(replacementVal, wildcard.Regex, wildcard.RegexReplaceBy);
replacementVal = Regex.Match(replacementVal, wildcard.Regex).Value;
}
// Replace all wildcards with the replacement value (case insensitive)
var wildcardPattern = Regex.Escape(string.Format("%{0}%", wildcard.Name));
str = Regex.Replace(str, wildcardPattern, replacementVal, RegexOptions.Singleline | RegexOptions.IgnoreCase);
// Return the new string
return str;
}
非常感谢,感谢您的帮助。
答案 0 :(得分:11)
Regex.Replace
method用指定的替换替换所有与正则表达式模式匹配的不重叠子字符串。
Regex.Match
method在指定的输入字符串中搜索正则表达式的首次出现。
因此,当您有一个像1002945
这样的字符串,并且想从末尾精确得到4位数字时,可以使用
var result = Regex.Replace("1002945", @".*([0-9]{4})$", "$1", RegexOptions.Singleline);
或
var matchResult = Regex.Match("1002945", @"[0-9]{4}$");
if (matchResult.Success)
{
Console.WriteLine(matchResult.Value);
}
替换时,必须匹配整个字符串,仅匹配和捕获捕获仅是数字的最后四个字符,并断言正则表达式索引位于字符串的末尾($
) 。请注意,使用RegexOptions.Singleline
option允许.
匹配换行符,默认情况下不匹配。替换字符串应为$1
,即对第一个捕获数字的捕获组的替换反向引用。
使用Regex.Match("1002945", @"[0-9]{4}$").Value
时,您会匹配 4个数字,后跟字符串末尾或换行符以及字符串末尾(这是因为$
匹配这样,如果您不想在换行符和字符串结尾之间允许匹配,请使用\z
manchor)。获得匹配项后,您可以使用matchResult.Success
检查它是成功还是失败,如果存在匹配项,则获取matchResult.Value
。由于正则表达式中没有RegexOptions.Singleline
,因此您不再需要.
。
答案 1 :(得分:8)
.*(?=.{4})$
将匹配所有内容,直到字符串的最后四个字符。如果将匹配项替换为String.Empty
,则仅保留这四个字符。
如果字符串包含的字符少于四个,则它们将保留在字符串中,因为正则表达式根本不匹配,因此无需替换。
答案 2 :(得分:3)
您无需为此使用正则表达式。
string MyLast4Characters = MyString.Substring(((MyString.Length >= 4) ? (MyString.Length - 4) : (0)));
该部分((MyString.Length >= 4) ? (4) : (0))
用于检查原始字符串是否长于或等于4个字符,然后它将返回最后4个字符,否则返回整个字符串
答案 3 :(得分:1)
如果必须使用正则表达式,我想您要:
.{4}(?=\s|$)
但是我同意正则表达式可能不是这里的最佳解决方案。
明细:
. : any character
{4} : exacty four times
(?= : followed by
\s : white space
| : or
$ : a line ending
) : end the followed by section
答案 4 :(得分:0)
我想这与您的RegexOptions
有关。在我的示例中,我使用SingleLine
模式((?s)
)和多行字符串:
static void RegexTest()
{
string str = "i am long string\r\nwith the number 1002945";
string pattern = @"(?s)[0-9]{4}$"; // or @"(?s).{4}$"
string num = Regex.Match(str, pattern).Value;
}
答案 5 :(得分:0)
我会使用Regex.Match
方法。
它仅符合您的需求。
您可以使用以下两种方法之一。
string str = "asdf 12345";
if (str.Length > 4)
{
// Abbreviated ..
Console.WriteLine( "{0}", Regex.Match(str, @"(?s).{5}$").Value );
// Verbose ...
Regex rx = new Regex(@"(?s).{5}$");
str = rx.Match(str).Value;
Console.WriteLine( "{0}", str );
}
else {} // Do something else
输出
12345
12345
答案 6 :(得分:0)
为此,您可以尝试使用Reverse()
例如:-
string input = "1002945";
string rev = new string(input.Reverse().ToArray());
string res = null;
Match match = Regex.Match(rev, @"\d{4}");
if (match != null && !String.IsNullOrEmpty(match.Value))
{
res = new string(match.Value.Reverse().ToArray());
}
输出:-
2945
答案 7 :(得分:0)
我将在匹配组中尽可能多地使用Regex.Match:
string str = "Hello :) 1002945";
string pattern = @"(.).*(\d{4})$";
Match match = Regex.Match(str, pattern);
if (match.Success)
{
string firstChar = match.Groups[1].Value;
string lastNumber = match.Groups[2].Value;
Console.WriteLine("First character : " + firstChar);
Console.WriteLine("Last number : " + lastNumber);
}
输出:
First character : H
Last number : 2945