2016-02-12 61 views
0

我需要编写一个程序,当它在文本中找到"."应该检查下一个词,如果用大写字母(大写)开始,然后它将但在此之前的词“”在列表框中,如果不是(与小写开头),则但在另一个列表框中面前的字 我有这远,但它似乎不是很有用:检查是否字开始大写或小写

string st= File.ReadAllText(@"D:\\f1.txt"); 
textBox1.Text = st; 
string[] s = st.Split(' '); 
for (int i = 0; i <= s.Length; i++) 
{ 
    if (s[i] == ".") 
    { 
     string v = s[i + 1]; 
     var c = v.ToCharArray(); 
     string ss=Convert.ToString(c[0]); 
     if (Regex.IsMatch(ss, "[A-Z]")) 
      listBox1.Items.Add(s[i - 1]); 
     else 
      listBox2.Items.Add(s[i - 1]); 
    } 

}

+1

你为什么不检查是否ss.StartsWith(ss.ToUpper())'或'ss.ToLower('的价值)'有在C#弦乐..你也可以使用'IndexOf'功能查找后的值'StartsWith'功能'.'以及它也将帮助,如果你会编辑的问题,并粘贴至少第一线的文本文件,以便我们可以看到你在看什么 – MethodMan

+0

请解释这些字符串的格式是什么。空格是否会将点和下一个/前一个单词分开?下一个词是否被附加在这个词上? – Steve

+0

如果你在一个空间分割,你不一定会在's'的一个数组元素中得到'.'。请参阅例如'你好。尼斯weather',如果拆分的空间,你会得到'字符串[] S = { “你好”, “有”, “好”, “天气”}',所以检查'S [I] == “对于这种情况下的集合中的任何元素,”。“不会满足,你的逻辑还不完全正确。向我们展示一些'D:\ f1.txt'文件和预期的输出/结果是很好的。 –

回答

1

你也许可以做到这一点与正则表达式。

(?<!\S)(\w+)\s+\.(?=\s+(\w+)(?!\S))

扩展

(?<! \S) 
(\w+)      # (1) 
\s+ 
\. 
(?= 
     \s+ 
     (\w+)      # (2) 
     (?! \S) 
) 

在while循环,每个匹配检查,如果捕获组2点开始与资本。
如果这样就把捕捉到1列表框中1,如果不是,把捕捉1列表框中2.

新增

注意,这是试图模仿你的代码的功能。
因此它使用第二个值的向前看,这又可以是可以是
下一个值点对值中的第一个值。

C#示例

string f1_txt = @"abc . DEF . ghi . JKL some, junk, some, junk, mno . PQR some junk stu . VWX"; 
Regex Rx = new Regex(@"(?<!\S)(\w+)\s+\.(?=\s+(\w+)(?!\S))"); 

Match _matchData = Rx.Match(f1_txt); 
while (_matchData.Success) 
{ 
    if (char.IsUpper(_matchData.Groups[ 2 ].Value[ 0 ])) 
     Console.WriteLine("Add {0} to ListBox1", _matchData.Groups[ 1 ].Value); 
    else 
     Console.WriteLine("Add {0} to ListBox2", _matchData.Groups[ 1 ].Value); 
    _matchData = _matchData.NextMatch(); 
} 
return; 

输出

Add abc to ListBox1 
Add DEF to ListBox2 
Add ghi to ListBox1 
Add mno to ListBox1 
Add stu to ListBox1 
+0

:(我完全陌生的C#和发现正则表达式的方式,我真的不知道如何处理它,你会介意进一步解释。 –

+0

让我试着用C#示例进行更新。 – sln

0

Char.IsUpper()显然是最简单,最实用的方法。但是,如果你想打动面试官,这将工作:

bool StartsWithUpper(string word) 
{ 
    return Enumerable.Range(65, 26).Contains((int)word[0]); 
} 
相关问题