Regex للكلمات باسكالكي (AKA Camelcased بالحرف الكبير الرائد)

StackOverflow https://stackoverflow.com/questions/1128305

سؤال

كيف يمكنني العثور على جميع باسكالكياد الكلمات في وثيقة مع تعبير منتظم؟

إذا كنت لا تعرف كلمة Pascal Cased، فأنا مهتم فقط بالرائدة حالة الجمل العلوي (أي الكلمات التي غسرها الجمل التي يتم فيها رسملة الحرف الأول).

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

المحلول

([A-Z][a-z0-9]+)+

على افتراض اللغة الإنجليزية. استخدم فئات الأحرف المناسبة إذا كنت تريدها تداولها. هذا سوف يتطابق مع الكلمات مثل "هذا". إذا كنت ترغب في مطابقة الكلمات فقط مع عواصتين على الأقل، استخدم فقط

([A-Z][a-z0-9]+){2,}

تحديث: كما ذكرت في تعليق، هناك نسخة أفضل هي:

[A-Z]([A-Z0-9]*[a-z][a-z0-9]*[A-Z]|[a-z0-9]*[A-Z][A-Z0-9]*[a-z])[A-Za-z0-9]*

إنه يطابق السلاسل التي تبدأ بحرف كبير، تحتوي على أحرف وأرقام فقط، وتحتوي على حرف صغير على الأقل وحرفا كبيرا واحدا على الأقل.

نصائح أخرى

انخفاض حالة الجمل

يتضمن هذا Regex عدد وينفذ قضية الجمل الصارمة كما هو محدد من قبل دليل Google Java Styleالتحقق من صحة Regex.

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. الشخصية الأولى هي حالة صغيرة.
  2. العناصر التالية إما رقم واحد أو حرف علبة علوية تليها أحرف الحالات السفلية.
  3. يمكن أن تكون الشخصية الأخيرة حالة علوية.

هنا هو مقتطف توضيح هذا regex. العناصر التالية صالحة.

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

حالة الجمل العلوي

نفس المبدأ الذي يستخدمه لخفض علبة الجمل ذات الطابع العلوي دائما.

([A-Z][a-z0-9]+)((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?

هنا هو مقتطف توضح هذا regex. العناصر التالية صالحة.

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D

Regexp الذي حل مشكلتي (تسمية الدلائل التي سيتم التعرف عليها بواسطة خدمة WITMEE DBFIT Web) هي:

(^[A-Z][a-z0-9]+[A-Z]$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$) 

أنا عكس هندسة هذه القواعد الكاميلية المعينة، فهي:

1. First character uppercase alpha
2. Next 1-n characters lowercase alphanumeric
3. Next character (n+1) uppercase alpha
4. Next 0 or more characters lowercase alphanumeric
No consecutive uppercase; no special characters.
Pattern may be repeated, e.g. NoChildLeftBehindSuite9102

اجتاز التعبير اختباري على النحو التالي:

Camel01C is CamelCase syntax
Camel01c01 is not CamelCase syntax
Camel01C01 is CamelCase syntax
Camel01CC01 is not CamelCase syntax
Camel0a1c1 is not CamelCase syntax
Camel0a1C1 is CamelCase syntax
Camel0ac1b1C1 is CamelCase syntax
CamelC is CamelCase syntax
CamelC1 is CamelCase syntax
CamelCA is not CamelCase syntax
CamelCa1 is CamelCase syntax
CamelCa_1 is not CamelCase syntax
IbsReleaseTestVerificationRegressionSuite is CamelCase syntax
IbsReleaseTestVerificationRegressioNSuite is not CamelCase syntax
IbsReleaseTestVerificationRegressioN is CamelCase syntax

adam crume's regex هو قريب، ولكن لن تتطابق على سبيل المثال IFoo أو HTTPConnection. وبعد لست متأكدا من الآخرين، ولكن أعط هذا واحد محاولة:

\b[A-Z][a-z]*([A-Z][a-z]*)*\b

نفس التحذير أما بالنسبة لإجابة آدم فيما يتعلق بالأرقام، I18N، Underscores إلخ.

يمكنك اختبارها هنا.

يبدو أن هذا يفعل ذلك:

/^[A-Z][a-z]+([A-Z][a-z]+)+/

لقد قمت بتضمين اختبارات وحدة روبي:

require 'test/unit'

REGEX = /^[A-Z][a-z]+([A-Z][a-z]+)+/

class RegExpTest < Test::Unit::TestCase
  # more readable helper
  def self.test(name, &block)
    define_method("test #{name}", &block)
  end

  test "matches camelcased word" do
    assert 'FooBar'.match(REGEX)
  end

  test "does not match words starting with lower case" do
    assert ! 'fooBar'.match(REGEX)
  end

  test "does not match words without camel hump" do
    assert ! 'Foobar'.match(REGEX)
  end

  test "matches multiple humps" do
    assert 'FooBarFizzBuzz'.match(REGEX)
  end
end
([A-Z][a-z\d]+)+

يجب أن تفعل الخدعة لحالة الجمل العلوي. يمكنك إضافة السفلية الرائدة في ذلك أيضا إذا كنت لا تزال ترغب في النظر في شيء مثل حالة الجمل العلوي _isrunning.

فقط تعديل واحد من مقترحات @ adamcrume:

([A-Z]+[a-z0-9]+)+

هذا سوف يتطابق IFrame, ، لكن لا ABC. وبعد يتم مطابقة الكلمات الأخرى التي يتألف من الجمل، على سبيل المثال AbcDoesWork, ، و الاهم من ذلك، كما أنه يطابق الكلمات البسيطة التي ليس لديها خطاب رأسماليا على الأقل, ، على سبيل المثال Frame.

ما رأيك في هذا الإصدار؟ هل أفتقد بعض القضية المهمة؟

([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)

Java Regex لتتناسب مع السلسلة على قضية الجمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top