C# 按大写字母拆分字符串(不包括连字符的单词)

C# 按大写字母拆分字符串(不包括连字符的单词),c#,string,xpath,split,watin,C#,String,Xpath,Split,Watin,我使用WatiN在浏览器中根据我从网站上拉出的字符串单击链接 问题是,它提取的一些文本脱离了多行,因此它将字符串组合成一个单词。例子: “超耐腐蚀涂层合金钢”变为“超耐腐蚀涂层合金钢” 我正在尝试将字符串按所有大写字母拆分,只有连字符除外,这样我就可以开始按字符串的部分搜索链接 这就是我目前所拥有的 types = doc.DocumentNode.SelectNodes("//h3[@class='AbbrPrsnttn_PrsnttnNm']");

我使用WatiN在浏览器中根据我从网站上拉出的字符串单击链接

问题是,它提取的一些文本脱离了多行,因此它将字符串组合成一个单词。例子: “超耐腐蚀涂层合金钢”变为“超耐腐蚀涂层合金钢”

我正在尝试将字符串按所有大写字母拆分,只有连字符除外,这样我就可以开始按字符串的部分搜索链接

这就是我目前所拥有的

              types = doc.DocumentNode.SelectNodes("//h3[@class='AbbrPrsnttn_PrsnttnNm']");
                foreach (HtmlNode type in types)
                {
                    desc = type.InnerText.CleanText();

                    if (browser.Div(Find.ById("ProdPrsnttnGrpCntnr")).Element(Find.ByText(desc)).Exists)
                    {
                        browser.Div(Find.ById("ProdPrsnttnGrpCntnr")).Element(Find.ByText(desc)).Click();
                        System.Threading.Thread.Sleep(5000);
                        types = doc.DocumentNode.SelectNodes("//h3[@class='AbbrPrsnttn_PrsnttnNm']");
                        doc2.LoadHtml(browser.Html);
                        partTable = doc2.DocumentNode.SelectSingleNode("//div[@class='ItmTblGrp']");

                        MineNext(doc, doc2, browser, typeUrl, types, desc, partTable);
                    }

                    else
                    {
                        split = desc.Split(new Char[] { ' ' });

                    }

您可以使用
Char.IsUpper(“C”)
查找要拆分的索引。

下面是一个如何实现的示例:

更新了以同时分隔数字

using System;
using System.Text;

namespace SplitOnUppercase
{
    class Program
    {
        static void Main()
        {
            const string text = "Test42-10 UltraCorrosion-ResistantCoated Alloy-SteelNumberTest42";
            var result = new StringBuilder(text.Length);
            for (var i = 0; i < text.Length - 1; i++)
            {
                result.Append(text[i]);
                if (text[i] != ' ' && text[i] != '-' && (char.IsUpper(text[i + 1]) || !char.IsDigit(text[i]) && char.IsDigit(text[i + 1])))
                    result.Append(' ');
            }
            result.Append(text[text.Length - 1]);

            Console.WriteLine(result);
        }
    }
}
使用系统;
使用系统文本;
名称空间拆分大写字母
{
班级计划
{
静态void Main()
{
const string text=“Test42-10超耐腐蚀涂层合金-钢编号Test42”;
var结果=新的StringBuilder(text.Length);
对于(var i=0;i
我很确定String.Split(Char[])是区分大小写的,但我目前无法测试。 我不是在一台可以测试或编写c#的计算机上,但这应该是合乎逻辑的。这里面可能有很多语法错误

Char[] splitChars = {'A', 'B', etc....}; //what the string will be split by
string desc = inputString; // input string
string[] splitByCapital = desc.Split(splitChars);
string[] output = new string[splitByCapital.length];
for (int i = 0; i < splitByCapital.length; i++)
{
    if (splitByCapital[i].Contais("-"))
    {
        output = splitByCapital[i] + splitByCapital[i-1];
    }
    else
    {
        output = splitByCapital[i];
    }
}
Char[]splitChars={'A',B',等…}//字符串将被什么分割
string desc=inputString;//输入字符串
字符串[]splitByCapital=desc.Split(splitChars);
string[]输出=新字符串[splitByCapital.length];
for(int i=0;i
这里是我使用Linq编写的一个示例。可能有很多方法可以改进这一点

public static string TransformLinqExample(this string toTransform)
        {
            string answer = toTransform
                .ToCharArray()
                .Select(c => new string(c, 1))
                .Aggregate((a, c) => a += (CapitalLetters.Contains(c) && c.IsUpper() && !a.EndsWith("-") && !a.EndsWith(" ")) ? " " + c : "" + c);
            return answer;
        }
这里有一个完整的例子

using System;
using System.Linq;

namespace SplitProblem
{
    public static class StringAndCharExtensions
    {
        const string CapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        public static bool IsUpper(this string theChar)
        {
            return theChar.ToUpper() == theChar;
        }
        public static string TransformLinqExample(this string toTransform)
        {
            string answer = toTransform
                .ToCharArray()
                .Select(c => new string(c, 1))
                .Aggregate((a, c) => a += (CapitalLetters.Contains(c) && c.IsUpper() && !a.EndsWith("-") && !a.EndsWith(" ")) ? " " + c : "" + c);
            return answer;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string toSplit = "Ultra12.4 34.2 Corrosion-ResistantCoated 18-6 AlloySteel";
            string tranformed = toSplit.TransformLinqExample();
            Console.WriteLine("{0}\n\n", tranformed);

            foreach (var part in tranformed.Split(' '))
            {
                Console.WriteLine(part);
            }
            Console.ReadLine();
        }
    }
}

最简单的方法是使用正则表达式按大写字母拆分(以下代码不会按特殊字符或数字拆分字符串,为此,请更新正则表达式模式以包含特殊字符和数字)


另一个问题。我刚刚意识到一些子字符串中有数字,我还需要间隔。例如:“钢丝可锁18-8不锈钢”和“公制法兰头12.9级合金钢”如果我只是在以大写字母开头的单词之间添加空格,那么它们的末尾将标记一个数字。对于12.9或18-8等数字的第一个实例,我该如何处理间距?你能举个例子吗,比如“源字符串”->“所需转换字符串”?我意识到我需要怎么做。我确实需要使用Split,这样我就可以使用索引来构建初始字符串的片段。我使用的字符串可能以“自锁18-8不锈钢按钮头”开头,我想将它们转换为“自锁18-8不锈钢按钮头”,但问题是,当我使用WatiN命令浏览器根据该字符串单击链接时,有时找不到完整的字符串。因此,我必须使用拆分生成一个较短的字符串,并解析掉最后2个单词,所以我只是搜索“Self-Locking 18-8”,如果有帮助,这是一个我正在使用的示例页面。如果你检查每个部分,你可以看到大多数名称都被跨距分开,并在单独的行中,这给了我问题。@webminer07:我现在明白你的意思了,我会更新答案。
    var inputString = "AnyStringThatYouWantToSplitOnCap";
    var pattern = "[A-Z][a-z]+";
    Regex regex = new Regex(pattern);
    var matches = regex.Matches(inputString);
    StringBuilder value = new StringBuilder();
    foreach (Match item in matches)
    {
        value.AppendFormat("{0} ", item.Value);
    }