这个小小的挑战只是向我尖叫正常的表情,但到目前为止,我很难过。
我有一个包含两个数字的任意字符串。我需要提取这两个数字,这些数字将是n和m位长(n,m预先未知)。字符串的格式始终为
FixedWord[n digits]anotherfixedword[m digits]alotmorestuffontheend
第一个数字的格式为1.2.3.4
(位数变化),例如5.3.20
或5.3.10.1
或5.4
。
第二个是更简单的' m'数字(例如25
或2
)
例如"AppName5.2.6dbVer44Oracle.Group"
它呼喊模式匹配'因此"使用正则表达式提取"。任何人都可以进一步指导我吗?
TIA
答案 0 :(得分:1)
以下模式:
(\d+(?>\.\d+)*)\w+?(\d+)
将匹配此:
AppName5.2.6dbVer44Oracle.Group
\__________/ <-- match
\___/ \/ <-- captures
并将捕获您在捕获组中感兴趣的两个值。
像这样使用:
var match = Regex.Match(input, @"(\d+(?>\.\d+)*)\w+?(\d+)");
if (match.Success)
{
var first = match.Groups[1].Value;
var second = match.Groups[2].Value;
// ...
}
模式说明:
( # Start of group 1
\d+ # a series of digits
(?> # start of atomic group
\.\d+ # dot followed by digits
)* # .. 0 to n times
)
\w+? # some word characters (as few as possible)
(\d+) # a series of digits captured in group 2
答案 1 :(得分:0)
试试这个:
\w*?([\d|\.]+)\w*?([\d{1,4}]+).*
答案 2 :(得分:0)
您可以从以下内容开始:
^[a-zA-Z]+((?:\d+\.)+\d)[a-zA-Z]+(\d+).*$
我认为固定的单词只是由字母组成,而你想要匹配整个字符串。如果您愿意,可以将不在括号中的部分替换为实际固定的单词,或者根据需要更改字符集。我建议使用像https://regex101.com这样的工具来微调表达式。
答案 3 :(得分:0)
通过查找数字( )
,然后在集\d
中设置零个或多个*
个数字或句点来指定匹配[\d.]
,使其保持基本状态(该集合为\ d-或 - 文字期间):
var data = "AppName5.2.6dbVer44Oracle.Group";
var pattern = @"(\d[\d.]*)";
// Outputs:
// 5.2.6
// 44
Console.WriteLine (Regex.Matches(data, pattern)
.OfType<Match>()
.Select (mt => mt.Groups[1].Value));
每个匹配将是句子中的数字。因此,如果总数字集发生变化,模式将不会失败,并尽职地报告1到N个数字。
答案 4 :(得分:0)
只需查找数字,因为您只关心数字而不想检查整个输入字符串的语法。
Matches matches = Regex.Matches(input, @"\d+(\.\d+)*");
if (matches.Count >= 2) {
string number1 = matches[0].Value;
string number2 = matches[1].Value;
} else {
// Less than two numbers found
}
表达式\d+(\.\d+)*
表示:
\d+
一个或多个数字( )*
重复零次,一次或多次\.\d+
一个小数点(用\符号转义)后跟一个或多个数字。
和
\d
一位数( )
分组+
将表达式向左重复一次或多次*
将表达式重复到左边的零,一次或多次\
转义在正则表达式中具有特殊含义的字符.
任何角色(没有逃脱)\.
句点字符(“。”)。