![](/img/trans.png)
[英]Split a string by capital letters in DataFormatString C# - MySQL
[英]Split string by capital letters (excluding hyphenated words)
我正在使用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[] { ' ' });
}
以下是如何實現它的示例:
更新為也分開數字。
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);
}
}
}
您可以使用Char.IsUpper("C")
查找要拆分的索引。
我很確定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];
}
}
這是我使用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();
}
}
}
最簡單的方法是使用正則表達式來分割大寫字母(以下代碼不會將字符串拆分為特殊字符或數字,為此,請更新正則表達式模式以包含特殊字符和數字)。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.