سؤال

أنا أكتب بعض التعليمات البرمجية التي تحتاج إلى القيام به سلسلة تطبيع, كنت تريد أن تتحول إلى سلسلة معينة في جمل-قضية التمثيل (إن أفضل تخمين على الأقل).على سبيل المثال:

"the quick brown fox" => "TheQuickBrownFox"
"the_quick_brown_fox" => "TheQuickBrownFox"
"123The_quIck bROWN FOX" => "TheQuickBrownFox"
"the_quick brown fox 123" => "TheQuickBrownFox123"
"thequickbrownfox" => "Thequickbrownfox"

أعتقد أن عليك أن تكون قادرة على الحصول على فكرة من تلك الأمثلة.أريد أن نزيل جميع خاصة الشخصيات (', ", !, @, ., الخ) الاستفادة من كل كلمة (كلمات محددة من الفضاء ، _ أو -) أي أبرز الأرقام انخفض (زائدة/ الداخلية هي موافق ، ولكن هذا الشرط ليس الحيوية ، اعتمادا على صعوبة حقا).

أنا أحاول معرفة ما يمكن أن يكون أفضل وسيلة لتحقيق ذلك.تخميني الأول سيكون مع التعبير العادي لكن regex المهارات سيئة في أفضل حتى لا أعرف حقا من أين تبدأ.

فكرتي الأخرى ستكون حلقة وتحليل البيانات ، ويقول كسرها نزولا إلى الكلمات, تحليل كل واحد و إعادة بناء السلسلة بهذه الطريقة.

أو أن هناك طريقة أخرى التي يمكن أن تذهب نحو ذلك ؟

هل كانت مفيدة؟

المحلول

ماذا عن حل بسيط باستخدام سلاسل.StrConv في Microsoft.VisualBasic مساحة?(لا تنسى أن إضافة مرجع مشروع إلى Microsoft.VisualBasic):

using System;
using VB = Microsoft.VisualBasic;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0));
            Console.ReadLine();
        }
    }
}

نصائح أخرى

هذا regex مباريات كل الكلمات.ثم نحن Aggregate لهم طريقة أن تستفيد من أول حرف ، ToLowers بقية السلسلة.

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled);

private string CamelCase(string str)
{
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value));
}

private string CamelWord(string word)
{
    if (string.IsNullOrEmpty(word))
        return "";

    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
}

هذا الأسلوب يتجاهل أرقام بالمناسبة.لإضافة لهم ، يمكنك تغيير regex إلى @"[a-zA-Z]*|[0-9]*", أفترض لكن لم أجربها.

أي حل يتضمن مطابقة شخصيات معينة قد لا تعمل جيدا مع بعض الحرف ترميزات خاصة إذا Unicode التمثيل ، التي لديها العشرات من الفضاء الشخصيات الآلاف من 'الرموز', الآلاف من أحرف علامات التنقيط الآلاف من "رسائل" ، إلخ.سيكون من الأفضل حيث من الممكن استخدام المدمج في Unicode-علم وظائف.من حيث ما هو 'طابع خاص', حسنا يمكنك أن تقرر على أساس Unicode فئات.على سبيل المثال ، تشمل 'علامات الترقيم ولكن هل تشمل 'الرموز'?

ToLower(), IsLetter () ، وما إلى ذلك ينبغي أن يكون على ما يرام ، وتأخذ بعين الاعتبار كل ما يمكن الحروف في Unicode.مطابقة ضد شرطات ومائلة ربما ينبغي أن تأخذ في الاعتبار بعض العشرات من الفضاء داش أحرف Unicode.

هل يمكن أن ارتداء روبي النعال العمل :)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end

اعتقدت أنه سيكون من الممتع أن تحاول ذلك ، هنا ما جئت به:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            string sentence = "123The_quIck bROWN FOX1234";

            sentence = sentence.ToLower();

            char[] s = sentence.ToCharArray();

            bool atStart = true;
            char pChar = ' ';

            char[] spaces = { ' ', '_', '-' };
            char a;
            foreach (char c in s)
            {
                if (atStart && char.IsDigit(c)) continue;

                if (char.IsLetter(c))
                {
                    a = c;
                    if (spaces.Contains(pChar))
                        a = char.ToUpper(a);
                    sb.Append(a);
                    atStart = false;
                }
                else if(char.IsDigit(c))
                {
                    sb.Append(c);
                }
                pChar = c;
            }

            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top