按大写字母(不包括连字符词)分割字符串

3
我正在使用WatiN来根据我从网站上获取的字符串在浏览器中点击链接。
问题是它提取的一些文本跨越多行,因此将字符串合并为一个单词。例如:"Ultra Corrosion-Resistant Coated Alloy Steel" 变成了 "Ultra Corrosion-ResistantCoated Alloy Steel"
我正在尝试通过除了连字符化的所有大写字母以外的方式拆分字符串,以便可以按字符串部分开始搜索链接。
以下是我的进展。
              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[] { ' ' });

                    }
5个回答

2
这是一个实现方法的示例:
已更新为将数字分开。
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);
        }
    }
}

另一个问题。我刚意识到一些子字符串中有数字,我也想要加上空格。例如:“Wire-Lockable 18-8 Stainless Steel”和“Metric Flange-Head Class 12.9 Alloy Steel”如果我只在以大写字母开头的单词之间添加空格,那么它们将在末尾带有标记数字。我该如何在第一个数字实例(如12.9或18-8)上添加空格? - webminer07
1
你能否举个例子,比如“源字符串”->“期望转换后的字符串”? - Răzvan Flavius Panda
我意识到我需要这样做。我实际上需要使用Split,以便可以使用索引来构建初始字符串的片段。我正在处理可能以这种方式开头的字符串“Self-Locking18-8 StainlessSteel Button Head”,并且我想将它们转换为“Self-Locking 18-8 Stainless Steel Button Head”,但问题是当我使用WatiN告诉浏览器基于该字符串单击链接时,有时找不到完整的字符串。因此,我将使用split制作较短的字符串,并解析掉最后两个单词,以便只搜索“Self-Locking 18-8”。 - webminer07
如果您检查每个零件,您会发现大多数名称都被分成了跨度,并且在不同的行上,这给了我问题。此外,这是一个我正在处理的示例页面。 - webminer07
1
@webminer07:我现在明白你的意思了,我会更新答案。 - Răzvan Flavius Panda
那个完美地运行了!然后我执行了 desc = result.ToString();但是即使字符串最终正确,我使用“desc”browser.Div(Find.ById("ProdPrsnttnGrpCntnr")).Element(Find.ByText(desc)).Click();当它在浏览器上查找时,它无法找到匹配项,因为它们位于不同的行。所以我可以开始循环并从字符串末尾取出单词,直到在浏览器窗口中找到它吗?例如,“Left-Hand Thread Black-Oxide Alloy Steel”--->“Left-Hand Thread Black-Oxide Alloy”然后是“Left-Hand Thread Black-Oxide”,然后是“Left-Hand Thread Black”,直到成功为止? - webminer07

1
我相当确定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];
    }
}

1

这里是我使用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();
        }
    }
}

1
最简单的方法是利用正则表达式按大写字母拆分字符串(以下代码不会在特殊字符或数字上拆分字符串,若要这样做,请更新正则表达式模式以包括特殊字符和数字)。
    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);
    }

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接