【发布时间】:2019-10-16 05:10:07
【问题描述】:
我有一个 API 接受在进入服务器之前需要正确格式化的字符串。
进入服务器的格式如下
"{Country ABR} {Day/Hour} {State ABR} {Title} {hrs.} ({Month Year}.)"
客户可能发送的几种可能性:
"US Construction 7/70 hrs."
"IA Private hrs US.
"OIL US 8/70 hrs (Dec 2014).
转换用户输入后的几个有效示例是:
"US 7/70 MI Construction hrs."
"US IA Private hrs."
"US OIL 8/70 hrs. (Dec 2014)"
转换器将输入排列成正确的顺序。 hrs 总是以句点结尾并在句子外重新排列 ({Month Year}),如图所示。
目前为止
[TestMethod]
public void TestMethod1()
{
var toConvert = "USA Construction 70/700 (Dec 2014) hrs";
var converted = ConvertHOSRules(toConvert);
Assert.AreEqual(converted, "USA 70/700 Construction hrs.(Dec 2014)");
}
private string ConvertHOSRules(string input)
{
//todo refactor
string output = "";
string country = Regex.Match(input, @"\b(USA|CAN|MEX)\b").Value +" ";
string dateHours = Regex.Match(input,@"\d{1,2}\/\d{1,3}").Value + " ";
string hrs = Regex.Match(input, @"\b(hrs)\b").Value ;
var date = Regex.Match(input, @"\(([a-zA-Z]+\s{1}[0-9]{4})\)").Value + " ";
string title = input.Replace(country, "").Replace(date, "").Replace(dateHours, "").Replace(hrs, "");
output = $"{country} {dateHours} {title} {hrs}.{date}";
return output;
}
这是传递我需要重构.. +“”就像懒惰程序员的空守卫
【问题讨论】:
-
用这些例子做测试。然后尝试编写正则表达式以通过测试。
-
这听起来是一个非常具有挑战性的问题,主要是因为看起来用户正在输入纯文本。这意味着他们不知道您解析文本的规则,因此您不能期望他们以一致的方式输入任何内容。那么任何州或国家的缩写也可以是标题的一部分。还有很多其他人不会想到的事情。您能否更改 API 以使数据已被分成多个字段?
-
有关于示例的文档,因此客户可能发送的可能性是我正在考虑的唯一值。如果距离不远,那么我将发送一个错误的请求,其中包含一个错误代码,说明文本无效,请参阅文档以获取帮助
-
匹配项还会报告它们的位置。尝试匹配您知道其格式的所有子部分。对原始字符串使用区间算术,减去匹配的子部分。然后,删除任何仅由空格组成的不匹配区间。之后,最多应该有一个间隔。这是你的头衔。
-
@NicoSchertler 我在做什么我只是对(2014 年 12 月)有疑问。有什么建议吗?
标签: c# regex algorithm regex-group regex-alternation