RegEx: разделить строку заглавными буквами и заглавными буквами для создания шрифтов с малой заглавной буквы - PullRequest
1 голос
/ 27 марта 2010

Так что я целенаправленно держался подальше от RegEx, так как просто глядя на это убивает меня ... тьфу. Но теперь мне это нужно, и я действительно могу использовать некоторую помощь для этого в .NET (C # или VB.NET). Мне нужно разделить строку на основе капитализации или ее отсутствия. Например:

Я не в восторге

  1. "I"
  2. "Я не в курсе"
  3. "P"
  4. "ercase"

или

Агент ФБР Винтерс

  1. "ФБР А"
  2. "нежный"
  3. "W"
  4. "полупродукты"

Причина, по которой я это делаю, заключается в том, чтобы вручную создавать маленькие заглавные буквы, в которых строки без заглавных букв будут отправляться в верхнем регистре, а их размер шрифта составлял 80% от исходного размера шрифта. Ценю любую помощь, которая может быть оказана здесь.

Ответы [ 4 ]

2 голосов
/ 27 марта 2010

Звучит так, будто вам просто нужно сопоставить все, что не является заглавной буквой. Например:

input = Regex.Replace(input, @"[^A-Z]+", ToSmallCaps);

... где ToSmallCaps - это делегат MatchEvaluator , который преобразует сопоставленный текст в маленькие заглавные буквы, однако это именно то, что вы делаете. Например:

static string ToSmallCaps(Match m)
{
  return String.Format(@"<span style=""whatever"">{0}</span>", m.Value);
}

РЕДАКТИРОВАТЬ: более регулярное выражение для более удобной для Unicode версии будет @"[^\p{Lu}\p{Lt}]+", что соответствует одному или нескольким значениям, отличным от заглавной или заглавной буквы, на любом языке.

2 голосов
/ 27 марта 2010

Хотя ответ Алана, вероятно, решит вашу проблему, для полноты картины я выкладываю регулярное выражение, которое возвращает заглавные и строчные буквы как совпадения, как в вашем примере.

ANSI:

Regex.Matches("I'm not upPercase", @"[^a-z]+|[^A-Z]+");

Unicode:

Regex.Matches("I'm not upPercase", @"[^\p{Ll}]+|[^\p{Lu}]+");
1 голос
/ 27 марта 2010

Я думаю, что это регулярное выражение должно работать /([A-Z ]*)([^A-Z]*)/

Это делает эти расщепления на этих данных в соответствии с rubular.com

0 голосов
/ 11 ноября 2010

Я думаю, что это также может быть достигнуто с помощью утверждений в регулярных выражениях:

<?php
$str = 'TestMyFuncCall';
var_dump(preg_split('/(?=[A-Z])/', $str, null, PREG_SPLIT_NO_EMPTY));

Выход:

array(4) {
  [0]=>
  string(4) "Test"
  [1]=>
  string(2) "My"
  [2]=>
  string(4) "Func"
  [3]=>
  string(4) "Call"
}

Прошу прощения за PHP, Visual Studio недоступен. Но вы можете сделать то же самое в .NET, я уверен.

...