2

私は文字列「CamelCase」を持っています、私はこの正規表現を使用します:

string pattern = "(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])";          
string[] substrings = Regex.Split("CamelCase", pattern);

substring、キャメルとケースがありますが、このキャメルとケースのように全部入れてuppercase欲しいです。より良いのは、このCAMEL_CASEのような文字列を取得したいのですが、正規表現ですべてをピーズします。

4

4 に答える 4

4

以下は JavaScript の実装です。

function camelCaseToUpperCase(str) {
  return str.replace(/([a-z])([A-Z])/, '$1_$2').toUpperCase();
}

デモ

printList([ 'CamelCase', 'camelCase' ],
  function(value, idx, values) {
    return value + ' -> '
      + camelCaseToUpperCase(value) + ' -> '
      + camelToTitle(value, '_');
  }
);

// Case Conversion Functions
function camelCaseToUpperCase(str) {
  return str.replace(/([a-z])([A-Z])/, '$1_$2').toUpperCase();
}
function camelToTitle(str, delimiter) {
  return str.replace(/([A-Z][a-z]+)/g, ' $1') // Words beginning with UC
    .replace(/([A-Z][A-Z]+)/g, ' $1')         // "Words" of only UC
    .replace(/([^A-Za-z ]+)/g, ' $1')         // "Words" of non-letters
    .trim()                                   // Remove any leading/trailing spaces
    .replace(/[ ]/g, delimiter || ' ');       // Replace all spaces with the delim
}

// Utility Functions
function printList(items, conversionFn) {
  var str = '<ul>';
  [].forEach.call(items, function(item, index) {
    str += '<li>' + conversionFn(item, index, items) + '</li>';
  });
  print(str + '</ul>');
}
function print() {
  write.apply(undefined, arguments);
}
function println() {
  write.apply(undefined, [].splice.call(arguments,0).concat('<br />'));
}
function write() {
  document.getElementById('output').innerHTML += arguments.length > 1 ?
    [].join.call(arguments, ' ') : arguments[0]
}
#output {
  font-family: monospace;
}
<h1>Case Conversion Demo</h1>
<div id="output"></div>

于 2015-01-30T14:59:30.973 に答える
3

sed および tr unix ユーティリティを (端末から) 使用する...

echo "CamelCase" | sed -e 's/\([A-Z]\)/-\1/g' -e 's/^-//' | tr '-' '_' | tr '[:lower:]' '[:upper:]'

最後に「ID」が付いたキャメルケースの文字列があり、それをそのままにしておきたい場合は、これを使用してください...

echo "CamelCaseID" | sed -e 's/\([A-Z]\)/-\1/g' -e 's/^-//' | tr '-' '_' | tr '[:lower:]' '[:upper:]' | sed -e 's/I_D$/ID/g'

RubyでStringクラスを拡張することで...

class String
    def camelcase_to_underscore
       self.gsub(/::/, '/').
          gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
          gsub(/([a-z\d])([A-Z])/,'\1_\2').
          tr("-", "_").
          upcase
    end
end

これで、任意の文字列に対して camelcase_to_underscore メソッドを実行できます。例:

>> "CamelCase".camelcase_to_underscore
=> "CAMEL_CASE"
于 2015-07-21T21:55:09.110 に答える
3

Perl では、次のことができます。

$string = "CamelCase";
$string =~ s/((?<=[a-z])[A-Z][a-z]+)/_\U$1/g;
$string =~ s/(\b[A-Z][a-z]+)/\U$1/g;
print "$string\n";

置換は\U、見つかったグループを大文字に変換するために使用します。

eこれは、置換を評価する Perl のオプションを使用して単一の正規表現に圧縮できます。

$string = "CamelCase";
$string =~ s/(?:\b|(?<=([a-z])))([A-Z][a-z]+)/(defined($1) ? "_" : "") . uc($2)/eg;
print "$string\n";
于 2012-08-15T18:25:22.640 に答える
0
using System;
using System.Text.RegularExpressions;

public class Example
{
  public static void Main()
  {
    string input = "CamelCase";
    string output = Regex.Replace(input, 
      @"(?:\b|(?<=([A-Za-z])))([A-Z][a-z]*)", 
      m => string.Format(@"{0}{1}", 
        (m.Groups[1].Value.Length > 0)? "_" : "", m.Groups[2].Value.ToUpper()));
    Console.WriteLine(output);
  }
}

このコードをここでテストします。

于 2012-08-14T20:23:10.023 に答える