【问题标题】:how can I use String.IndexOf method to find the correct value?如何使用 String.IndexOf 方法找到正确的值?
【发布时间】:2013-09-09 02:57:48
【问题描述】:

我想让我的句子如下所示,但是如何使用 String.IndexOf 方法找到正确的 MINVALUE 值,以便在给定条件下从句子中的值变化开始?

句子

CREATE SEQUENCE "MY_TEST_SEQUENCE" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH 55 CACHE 20 NOORDER NOCYCLE

结果

CREATE SEQUENCE "MY_TEST_SEQUENCE" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH 8 CACHE 20 NOORDER NOCYCLE

条件

  1. 如果 MINVALUE 的值为正值 (8),则开始时的值与 最小值 (8)...
  2. 如果 MINVALUE 具有负 (-8) 值而不是从与 MAXVALUE (999) 相同的值开始

我的代码

var startvalue = 0;
if(MINVALUE > 0)
{
    startvalue = MINVALUE;
}
Else if(MINVALUE < 0)
{
    startvalue = MAXVALUE;
}
var result = String.Format(@"CREATE SEQUENCE ""MY_TEST_SEQUENCE"" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH {0}  CACHE 20 NOORDER NOCYCLE",startvalue)

【问题讨论】:

  • c#的String类有indexOf方法吗?
  • 我认为您在使用 @ 时不需要转义您的 "。您使用 @ 所以您不需要这样做。
  • @ethorn10 这不是作业!

标签: c# regex string winforms indexof


【解决方案1】:

我认为这应该适合你;

string sentence = @"CREATE SEQUENCE 'MY_TEST_SEQUENCE' MINVALUE -8 MAXVALUE 999 INCREMENT BY 1 START WITH 55 CACHE 20 NOORDER NOCYCLE";
string pattern = @".*\s+MINVALUE[ ]*(?<MinValue>[-?\d]*)[ ]*MAXVALUE[ ]*(?<MaxValue>[\d]*)";
Regex rgx = new Regex(pattern);
Match match = rgx.Match(sentence);
Group gp1 = match.Groups[1];//-8 or 8 (both valid).
Group gp2 = match.Groups[2];//Value after MAXVALUE.
if (gp1.Value.StartsWith("-") == false)//No minus sign,that must be a positive value.
{
  string s2 = string.Format(@"CREATE SEQUENCE ""MY_TEST_SEQUENCE"" MINVALUE 8 MAXVALUE 999  INCREMENT BY 1 START WITH {0} CACHE 20 NOORDER NOCYCLE", gp1.Value);
  MessageBox.Show(s2);
}

else if (gp1.Value.StartsWith("-") == true)//No need for further checking, a value with - will always be smaller.
{
  string s2 = string.Format(@"CREATE SEQUENCE ""MY_TEST_SEQUENCE"" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH {0} CACHE 20 NOORDER NOCYCLE", gp2.Value);
  MessageBox.Show(s2);
}

【讨论】:

【解决方案2】:

似乎带有捕获组的正则表达式比尝试将字符串分解成片段更合适。

var regex = new Regex(@".*\s+MINVALUE\s+(-?\d*)\s+MAXVALUE\s+(-?\d*)\s+.*");
var sentence = @"CREATE SEQUENCE ""MY_TEST_SEQUENCE"" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH 55 CACHE 20 NOORDER NOCYCLE";

var match = regex.Match(sentence);

if (match.Groups.Count != 3)
{
    throw new ApplicationException("input string not in expected format");
}

var minValue = int.Parse(match.Groups[1].Value);
var maxValue = int.Parse(match.Groups[2].Value);

var result = string.Format(@"CREATE SEQUENCE ""MY_TEST_SEQUENCE"" MINVALUE 8 MAXVALUE 999 INCREMENT BY 1 START WITH {0}  CACHE 20 NOORDER NOCYCLE", minValue < 0 ? maxValue : minValue);

【讨论】:

  • 错误 1 ​​'System.ApplicationException' 是一个“类型”,但使用起来像一个“变量”
  • @user2760129 - 忘记包含new,已修复
  • @user2760129 - 我没有测试它并且忽略了整个字符串将是匹配组之一的事实。我现在已经修好了。我希望这不是为了上课。如果是这样,你最好快速研究一下正则表达式,以防你的教授想知道你是如何想出这个解决方案的。 :)
猜你喜欢
  • 2023-04-05
  • 2022-01-13
  • 2013-04-25
  • 2014-12-24
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多