From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: John Mastro Newsgroups: gmane.emacs.help Subject: Fwd: How to check whether a character (or one-character string) is a letter? Date: Fri, 3 Oct 2014 19:47:39 -0700 Message-ID: References: <87iok0y8wr.fsf@wmi.amu.edu.pl> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Trace: ger.gmane.org 1412390902 27739 80.91.229.3 (4 Oct 2014 02:48:22 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 4 Oct 2014 02:48:22 +0000 (UTC) To: "help-gnu-emacs@gnu.org" Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sat Oct 04 04:48:17 2014 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XaFOI-0000i8-1d for geh-help-gnu-emacs@m.gmane.org; Sat, 04 Oct 2014 04:48:14 +0200 Original-Received: from localhost ([::1]:42143 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XaFOH-0002ns-Cd for geh-help-gnu-emacs@m.gmane.org; Fri, 03 Oct 2014 22:48:13 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59157) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XaFO5-0002nl-Po for help-gnu-emacs@gnu.org; Fri, 03 Oct 2014 22:48:03 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XaFO4-0003AX-Oi for help-gnu-emacs@gnu.org; Fri, 03 Oct 2014 22:48:01 -0400 Original-Received: from mail-oi0-x230.google.com ([2607:f8b0:4003:c06::230]:53322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XaFO4-0003AP-JS for help-gnu-emacs@gnu.org; Fri, 03 Oct 2014 22:48:00 -0400 Original-Received: by mail-oi0-f48.google.com with SMTP id g201so1594756oib.7 for ; Fri, 03 Oct 2014 19:47:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=DvTd97H7gU4bMBFVu5+qnoVyVwdxe+a9hrbIRjq86V0=; b=DreM0DXE1WSuXZKS0tJ22obQ3/pzi8itHFUG7/dlGHyEO9caiTHQo/POIhY0ky5G+9 RhTJYaRQyH6EoI0aDXQs0DYi3P1B8xFyez+UmMpl6LQGOFOr7AXlCqziOzPcc82stjPp LxiMgRM4TPxpLWVHV+HXa9bH7uG/jGZK2uas8C7V4QmKyfqhQXYLBOpRIIP2CXGCVTEW 3+DGhrJBq4cclhhJWxeHqhZ2oiz0O6wR57KKDc93u7x/dGZLUq8rgRQ8m3p7ewJHESEI aFCKT/F5Wzrugut0Mepv6cSe24wydqpqDOBsiZv6gvABaAFupcdY8zZvD9RiIzas3XM4 ww5w== X-Received: by 10.60.142.165 with SMTP id rx5mr11281163oeb.5.1412390879607; Fri, 03 Oct 2014 19:47:59 -0700 (PDT) Original-Received: by 10.76.125.194 with HTTP; Fri, 3 Oct 2014 19:47:39 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c06::230 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:100258 Archived-At: [I first sent this directly to Marcin in error - yeah, I use the email gateway] Hi Marcin, Marcin Borkowski wrote: > Assume that I have a character (taken from some string, which in turn is > copied from the buffer - so it need not be ASCII). What is the best way > to check whether it is a letter within ASCII range? > > The reason I'm asking is that I'm writing a function which converts an > arbitrary string to a valid (and nice) filename (e.g., only letters and > hyphens) - so basically I want to walk a string character by character > and convert any space to a hyphen and omit any other non-letter. Am I > reinventing the wheel? There are a bunch of ways to do this, but one reasonable approach is to use a regular expression. I think this will do what you want: (defun reasonable-filename (str) (let* ((str (replace-regexp-in-string "[ \t\n\r]" "-" str)) (str (replace-regexp-in-string "[^a-zA-Z-]" "" str))) str)) This is a variation which will also allow the result to contain numbers: (defun reasonable-filename (str) (let* ((str (replace-regexp-in-string "[ \t\n\r]" "-" str)) (str (replace-regexp-in-string "[^a-zA-Z0-9-]" "" str))) str)) To answer your question about identifying whether a character is an ASCII letter, the key is that Emacs's characters are really "just" integers. Wikipedia has some charts[1] that show the numbers associated with the characters. The letters are conveniently grouped together, so we can use something like this: (defun ascii-letter-p (char) (and (characterp char) (>= char 65) (<= char 122))) (Of course, this only works if it's really a character, as opposed to a string of length one. If it's a string of length one you could either "extract" the character with `aref' or use a regular expression instead.) Hope that helps. [1] https://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart -- john