3

WatiN を使用して、サイトから取得した文字列に基づいてブラウザでリンクをクリックしています。

問題は、取得するテキストの一部が複数の行から外れているため、文字列を 1 つの単語に結合することです。例:「超耐食被覆合金鋼」は「超耐食被覆合金鋼」になります。

文字列の一部でリンクの検索を開始できるように、ハイフンでつながれたものを除くすべての大文字で文字列を分割しようとしています。

これは私がこれまでに持っているものです

              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[] { ' ' });

                    }
4

5 に答える 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);
        }
    }
}
于 2012-11-12T23:24:26.267 に答える
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);
    }
于 2013-05-16T05:34:59.790 に答える
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];
    }
}
于 2012-11-12T23:30:01.347 に答える
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();
        }
    }
}
于 2012-11-13T18:47:04.763 に答える
1

を使用して、Char.IsUpper("C")分割するインデックスを見つけることができます。

于 2012-11-12T22:54:31.520 に答える